diff --git a/build.xml b/build.xml
index ead34bc29..a46a980f5 100644
--- a/build.xml
+++ b/build.xml
@@ -3,7 +3,7 @@
@@ -232,7 +232,7 @@
-
+
diff --git a/src/java/org/apache/commons/math/Freq.java b/src/java/org/apache/commons/math/Freq.java
new file mode 100644
index 000000000..259f0de25
--- /dev/null
+++ b/src/java/org/apache/commons/math/Freq.java
@@ -0,0 +1,179 @@
+/* ====================================================================
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2003 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Commons", and "Apache Software
+ * Foundation" must not be used to endorse or promote products derived
+ * from this software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * .
+ */
+package org.apache.commons.math;
+
+import java.util.Hashtable;
+import java.util.Enumeration;
+
+/**
+ * Maintains a frequency distribution.
+ * Accepts int, long or string values, converting
+ * all to Strings and maintaining frequency counts.
+ *
+ * @author Phil Steitz
+ */
+
+public class Freq {
+
+ private String name;
+
+ private Hashtable freqTable;
+
+ /** instance initializer */
+ {
+ freqTable = new Hashtable();
+ }
+
+ public Freq() {
+ }
+
+ public Freq(String name) {
+ this.name = name;
+ }
+
+ public String toString() {
+ StringBuffer outBuffer = new StringBuffer();
+ outBuffer.append("Value \t Frequency \n");
+ Enumeration e = freqTable.keys();
+ Long count = null;
+ String value = null;
+ while (e.hasMoreElements()) {
+ value = (String)e.nextElement();
+ count = (Long)freqTable.get(value);
+ outBuffer.append(value);
+ outBuffer.append("\t");
+ outBuffer.append(count.toString());
+ outBuffer.append("\n");
+ }
+ return outBuffer.toString();
+ }
+
+ public String toXML() {
+ return null;
+ }
+
+ /** Adds 1 to the frequency count for v */
+ public void addValue(java.lang.String v) {
+ insertValue(v);
+ }
+
+ /** Adds 1 to the frequency count for v */
+ public void addValue(int v) {
+ insertValue((new Integer(v)).toString());
+ }
+
+ /** Adds 1 to the frequency count for v */
+ public void addValue(long v) {
+ insertValue((new Long(v)).toString());
+ }
+
+ /** Returns the number of values = v */
+ public long getCount(String v) {
+ Long ct = (Long)freqTable.get(v);
+ if (ct == null) {
+ return 0;
+ } else {
+ return ct.longValue();
+ }
+ }
+
+ /** Returns the sum of all frequencies */
+ public long getSumFreq() {
+ Enumeration e = freqTable.keys();
+ long count = 0;
+ String value = null;
+ while (e.hasMoreElements()) {
+ value = (String)e.nextElement();
+ count += ((Long)freqTable.get(value)).longValue();
+ }
+ return count;
+ }
+
+ /** Returns the percentage of values = v */
+ public double getPct(String v) {
+ return (new Double(getCount(v))).doubleValue()
+ /(new Double(getSumFreq())).doubleValue();
+ }
+
+ /** Clears the frequency table */
+ public void clear() {
+ freqTable.clear();
+ }
+
+ /** Adds 1 to the frequency count for v */
+ private void insertValue(String v) {
+ Long ct = (Long)freqTable.get(v);
+ if (ct == null) {
+ Long val = new Long(1);
+ freqTable.put(v,val);
+ } else {
+ freqTable.put(v,(new Long(ct.longValue()+1)));
+ }
+ }
+
+ /** Getter for property name.
+ * @return Value of property name.
+ */
+ public java.lang.String getName() {
+ return name;
+ }
+
+ /** Setter for property name.
+ * @param name New value of property name.
+ */
+ public void setName(java.lang.String name) {
+ this.name = name;
+ }
+
+}
diff --git a/src/java/org/apache/commons/math/RealMatrix.java b/src/java/org/apache/commons/math/RealMatrix.java
new file mode 100644
index 000000000..3447a41bf
--- /dev/null
+++ b/src/java/org/apache/commons/math/RealMatrix.java
@@ -0,0 +1,226 @@
+/* ====================================================================
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2003 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Commons", and "Apache Software
+ * Foundation" must not be used to endorse or promote products derived
+ * from this software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * .
+ */
+
+package org.apache.commons.math;
+
+/**
+ * Interface defining a real-valued matrix with basic algebraic operations
+ * @author Phil Steitz
+ * @version $Revision: 1.1 $ $Date: 2003/05/12 19:03:41 $
+ */
+public interface RealMatrix {
+
+ public RealMatrix copy();
+
+ /**
+ * Compute the sum of *this and m
+ * @param m matrix to be added
+ * @return this + m
+ * @exception IllegalArgumentException if m is not the same size as *this
+ */
+ public RealMatrix add(RealMatrix m);
+
+ /**
+ * Compute *this minus m
+ * @param m matrix to be subtracted
+ * @return this + m
+ * @exception IllegalArgumentException if m is not the same size as *this
+ */
+ public RealMatrix subtract(RealMatrix m);
+
+ /**
+ * Returns the rank of the matrix
+ * @return the rank of this matrix
+ */
+ public int getRank();
+
+ /**
+ * Returns the result of adding d to each entry of *this
+ * @param d value to be added to each entry
+ * @return d + this
+ */
+ public RealMatrix scalarAdd(double d);
+
+ /**
+ * Returns the result multiplying each entry of *this by d
+ * @param d value to multiply all entries by
+ * @return d*this
+ */
+ public RealMatrix scalarMultiply(double d);
+
+ /**
+ * Returns the result postmultiplyin *this by m
+ * @param m matrix to postmultiply by
+ * @return this*m
+ * @throws IllegalArgumentException
+ * if columnDimension(this) != rowDimension(m)
+ */
+ public RealMatrix multiply(RealMatrix m);
+
+ /**
+ * Returns matrix entries as a two-dimensional array
+ * @return 2-dimensional array of entries
+ */
+ public double[][] getData();
+
+ /**
+ * Sets/overwrites the underlying data for the matrix
+ * @param 2-dimensional array of entries
+ */
+ public void setData(double[][] data);
+
+ /**
+ * Returns the norm of the matrix
+ * @return norm
+ */
+ public double getNorm();
+
+ /**
+ * Returns entries in row as an array
+ * @param row the row to be fetched
+ * @return array of entries in the row
+ * @throws IllegalArgumentException if row > rowDimension
+ */
+ public double[] getRow(int row);
+
+ /**
+ * Returns entries in column as an array
+ * @param col column to fetch
+ * @return array of entries in the column
+ * @throws IllegalArgumentException if column > columnDimension
+ */
+ public double[] getColumn(int col);
+
+ /**
+ * Returns the entry in the specified row and column
+ * @param row row location of entry to be fetched
+ * @param col column location of entry to be fetched
+ * @return matrix entry in row,column
+ * @throws IllegalArgumentException if entry does not exist
+ */
+ public double getEntry(int row, int column);
+
+ /**
+ * Sets the entry in the specified row and column to the specified value
+ * @param row row location of entry to be set
+ * @param col column location of entry to be set
+ * @param value value to set
+ * @throws IllegalArgumentException if entry does not exist
+ */
+ public void setEntry(int row, int column, double value);
+
+ /**
+ * Returns the transpose of this matrix
+ * @return transpose matrix
+ */
+ public RealMatrix transpose();
+
+ /**
+ * Returns the inverse of this matrix
+ * @return inverse matrix
+ * @throws IllegalArgumentException if *this is not invertible
+ */
+ public RealMatrix inverse();
+
+ /**
+ * Returns the determinant of this matrix
+ * @returns determinant
+ */
+ public double getDeterminant();
+
+ /**
+ * Is this a square matrix?
+ * @return true if the matrix is square (rowDimension = columnDimension)
+ */
+ public boolean isSquare();
+
+ /**
+ * Is this a singular matrix?
+ * @return true if the matrix is singular
+ */
+ public boolean isSingular();
+
+ /**
+ * Returns the number of rows in the matrix
+ * @return rowDimension
+ */
+ public int getRowDimension();
+
+ /**
+ * Returns the number of columns in the matrix
+ * @return columnDimension
+ */
+ public int getColumnDimension();
+
+ /**
+ * Returns the trace of the matrix
+ * @return trace
+ */
+ public double getTrace();
+
+ /**
+ * Returns the result of multiplying this by vector v
+ * @return this*v
+ * @throws IllegalArgumentException if columnDimension != v.size()
+ */
+ public double[] operate(double[] v);
+
+ /**
+ * Returns the result of premultiplying this by vector v
+ * @return v*this
+ * @throws IllegalArgumentException if rowDimension != v.size()
+ */
+ public RealMatrix preMultiply(double[] v);
+}
+
diff --git a/src/java/org/apache/commons/math/RealMatrixImpl.java b/src/java/org/apache/commons/math/RealMatrixImpl.java
new file mode 100644
index 000000000..67457ab88
--- /dev/null
+++ b/src/java/org/apache/commons/math/RealMatrixImpl.java
@@ -0,0 +1,377 @@
+/* ====================================================================
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2003 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Commons", and "Apache Software
+ * Foundation" must not be used to endorse or promote products derived
+ * from this software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * .
+ */
+
+package org.apache.commons.math;
+
+/**
+ * Implementation for RealMatrix using double[][] array
+ * @author Phil Stetiz
+ * @version $Revision: 1.1 $ $Date: 2003/05/12 19:04:10 $
+ */
+public class RealMatrixImpl implements RealMatrix {
+
+ private double data[][];
+
+ public RealMatrixImpl() {
+ }
+
+ /**
+ * Create a new RealMatrix with the supplied row and column dimensions
+ * @param rowDimension the number of rows in the new matrix
+ * @param columnDimension the number of columns in the new matrix
+ * @return newly created matrix
+ */
+ public RealMatrixImpl(int rowDimension,
+ int columnDimension) {
+ data = new double[rowDimension][columnDimension];
+ }
+
+ public RealMatrixImpl(double[][] data) {
+ this.data = data;
+ }
+
+ /**
+ * Create a new RealMatrix which is a copy of *this
+ * @return the cloned matrix
+ */
+ public RealMatrix copy() {
+ return null;
+ }
+
+ /**
+ * Compute the sum of *this and m
+ * @param m matrix to be added
+ * @return this + m
+ * @exception IllegalArgumentException if m is not the same size as *this
+ */
+ public RealMatrix add(RealMatrix m) {
+ if (this.getColumnDimension() != m.getColumnDimension() ||
+ this.getRowDimension() != m.getRowDimension()) {
+ throw new IllegalArgumentException("matrix dimension mismatch");
+ }
+ int rowCount = this.getRowDimension();
+ int columnCount = this.getColumnDimension();
+ double[][] outData = new double[rowCount][columnCount];
+ double[][] mData = m.getData();
+ for (int row = 0; row < rowCount; row++) {
+ for (int col = 0; col < columnCount; col++) {
+ outData[row][col] = data[row][col] + mData[row][col];
+ }
+ }
+ return new RealMatrixImpl(outData);
+ }
+
+ /**
+ * Compute *this minus m
+ * @param m matrix to be subtracted
+ * @return this + m
+ * @exception IllegalArgumentException if m is not the same size as *this
+ */
+ public RealMatrix subtract(RealMatrix m) {
+ if (this.getColumnDimension() != m.getColumnDimension() ||
+ this.getRowDimension() != m.getRowDimension()) {
+ throw new IllegalArgumentException("matrix dimension mismatch");
+ }
+ int rowCount = this.getRowDimension();
+ int columnCount = this.getColumnDimension();
+ double[][] outData = new double[rowCount][columnCount];
+ double[][] mData = m.getData();
+ for (int row = 0; row < rowCount; row++) {
+ for (int col = 0; col < columnCount; col++) {
+ outData[row][col] = data[row][col] - mData[row][col];
+ }
+ }
+ return new RealMatrixImpl(outData);
+ }
+
+ /**
+ * Returns the rank of the matrix
+ * @return the rank of this matrix
+ */
+ public int getRank() {
+ throw new UnsupportedOperationException("not implemented yet");
+ }
+
+
+ /**
+ * Returns the result of adding d to each entry of *this
+ * @param d value to be added to each entry
+ * @return d + this
+ */
+ public RealMatrix scalarAdd(double d) {
+ int rowCount = this.getRowDimension();
+ int columnCount = this.getColumnDimension();
+ double[][] outData = new double[rowCount][columnCount];
+ for (int row = 0; row < rowCount; row++) {
+ for (int col = 0; col < columnCount; col++) {
+ outData[row][col] = data[row][col] + d;
+ }
+ }
+ return new RealMatrixImpl(outData);
+ }
+
+ /**
+ * Returns the result multiplying each entry of *this by d
+ * @param d value to multiply all entries by
+ * @return d*this
+ */
+ public RealMatrix scalarMultiply(double d) {
+ int rowCount = this.getRowDimension();
+ int columnCount = this.getColumnDimension();
+ double[][] outData = new double[rowCount][columnCount];
+ for (int row = 0; row < rowCount; row++) {
+ for (int col = 0; col < columnCount; col++) {
+ outData[row][col] = data[row][col]*d;
+ }
+ }
+ return new RealMatrixImpl(outData);
+ }
+
+ /**
+ * Returns the result postmultiplying *this by m
+ * @param m matrix to postmultiply by
+ * @return this*m
+ * @throws IllegalArgumentException
+ * if columnDimension(this) != rowDimension(m)
+ */
+ public RealMatrix multiply(RealMatrix m) {
+ if (this.getColumnDimension() != m.getRowDimension()) {
+ throw new IllegalArgumentException
+ ("Matrices are not multiplication compatible.");
+ }
+ double[][] mData = m.getData();
+ double[][] outData =
+ new double[this.getRowDimension()][m.getColumnDimension()];
+ double sum = 0;
+ for (int row = 0; row < this.getRowDimension(); row++) {
+ for (int col = 0; col < m.getColumnDimension(); col++) {
+ sum = 0;
+ for (int i = 0; i < this.getColumnDimension(); i++) {
+ sum += data[row][i] * mData[i][col];
+ }
+ outData[row][col] = sum;
+ }
+ }
+ return new RealMatrixImpl(outData);
+ }
+
+ /**
+ * Returns matrix entries as a two-dimensional array
+ * @return 2-dimensional array of entries
+ */
+ public double[][] getData() {
+ return data;
+ }
+
+ /**
+ * Sets/overwrites the underlying data for the matrix
+ * @param 2-dimensional array of entries
+ */
+ public void setData(double[][] data) {
+ this.data = data;
+ }
+
+ /**
+ * Returns the 1-norm of the matrix (max column sum)
+ * @return norm
+ */
+ public double getNorm() {
+ double maxColSum = 0;
+ for (int col = 0; col < this.getColumnDimension(); col++) {
+ double sum = 0;
+ for (int row = 0; row < this.getRowDimension(); row++) {
+ sum += Math.abs(data[row][col]);
+ }
+ maxColSum = Math.max(maxColSum,sum);
+ }
+ return maxColSum;
+ }
+
+ /**
+ * Returns entries in row as an array
+ * @param row the row to be fetched
+ * @return array of entries in the row
+ * @throws IllegalArgumentException if row > rowDimension
+ */
+ public double[] getRow(int row) {
+ return data[row];
+ }
+
+ /**
+ * Returns entries in column as an array
+ * @param col column to fetch
+ * @return array of entries in the column
+ * @throws IllegalArgumentException if column > columnDimension
+ */
+ public double[] getColumn(int col) {
+ throw new UnsupportedOperationException("not implemented yet");
+ }
+
+ /**
+ * Returns the entry in the specified row and column
+ * @param row row location of entry to be fetched
+ * @param col column location of entry to be fetched
+ * @return matrix entry in row,column
+ * @throws IllegalArgumentException if entry does not exist
+ */
+ public double getEntry(int row, int column) {
+ if (row < 1 || column < 1 || row > this.getRowDimension()
+ || column > this.getColumnDimension()) {
+ throw new IllegalArgumentException
+ ("matrix entry does not exist");
+ }
+ return data[row-1][column-1];
+ }
+
+ /**
+ * Sets the entry in the specified row and column to the specified value
+ * @param row row location of entry to be set
+ * @param col column location of entry to be set
+ * @param value value to set
+ * @throws IllegalArgumentException if entry does not exist
+ */
+ public void setEntry(int row, int column, double value) {
+ if (row < 1 || column < 1 || row > this.getRowDimension()
+ || column > this.getColumnDimension()) {
+ throw new IllegalArgumentException
+ ("matrix entry does not exist");
+ }
+ data[row-1][column-1] = value;
+ }
+
+ /**
+ * Returns the transpose of this matrix
+ * @return transpose matrix
+ */
+ public RealMatrix transpose() {
+ throw new UnsupportedOperationException("not implemented yet");
+ }
+
+
+ /**
+ * Returns the inverse of this matrix
+ * @return inverse matrix
+ * @throws IllegalArgumentException if *this is not invertible
+ */
+ public RealMatrix inverse() {
+ throw new UnsupportedOperationException("not implemented yet");
+ }
+
+ /**
+ * Returns the determinant of this matrix
+ * @return determinant
+ */
+ public double getDeterminant() {
+ throw new UnsupportedOperationException("not implemented yet");
+ }
+
+ /**
+ * Is this a square matrix?
+ * @return true if the matrix is square (rowDimension = columnDimension)
+ */
+ public boolean isSquare() {
+ return (this.getColumnDimension() == this.getRowDimension());
+ }
+
+ /**
+ * Is this a singular matrix?
+ * @return true if the matrix is singular
+ */
+ public boolean isSingular() {
+ throw new UnsupportedOperationException("not implemented yet");
+ }
+
+ /**
+ * Returns the number of rows in the matrix
+ * @return rowDimension
+ */
+ public int getRowDimension() {
+ return data.length;
+ }
+
+ /**
+ * Returns the number of columns in the matrix
+ * @return columnDimension
+ */
+ public int getColumnDimension() {
+ return data[0].length;
+ }
+
+ /**
+ * Returns the trace of the matrix
+ * @return trace
+ */
+ public double getTrace() {
+ throw new UnsupportedOperationException("not implemented yet");
+ }
+
+ /**
+ * Returns the result of multiplying this by the vector b
+ * @return this*v
+ * @throws IllegalArgumentException if columnDimension != v.size()
+ */
+ public double[] operate(double[] v) {
+ throw new UnsupportedOperationException("not implemented yet");
+ }
+
+ /**
+ * Returns the result of premultiplying this by the vector v
+ * @return v*this
+ * @throws IllegalArgumentException if rowDimension != v.size()
+ */
+ public RealMatrix preMultiply(double[] v) {
+ throw new UnsupportedOperationException("not implemented yet");
+ }
+
+}
diff --git a/src/java/org/apache/commons/math/Univariate.java b/src/java/org/apache/commons/math/Univariate.java
new file mode 100644
index 000000000..5cbc0ce56
--- /dev/null
+++ b/src/java/org/apache/commons/math/Univariate.java
@@ -0,0 +1,259 @@
+/* ====================================================================
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2003 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Commons", and "Apache Software
+ * Foundation" must not be used to endorse or promote products derived
+ * from this software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * .
+ */
+package org.apache.commons.math;
+
+/**
+ *
+ * Accumulates univariate statistics for values fed in
+ * through the addValue() method. Does not store raw data values.
+ * All data (including n) are represented internally as doubles.
+ * Integers, floats and longs can be added, but will be converted
+ * to doubles by addValue().
+ *
+ * @author Phil Steitz
+ * @version $Revision: 1.1 $ $Date: 2003/05/12 19:04:10 $
+ *
+*/
+public class Univariate {
+
+ /** running sum of values that have been added */
+ private double sum = 0.0;
+
+ /** running sum of squares that have been added */
+ private double sumsq = 0.0;
+
+ /** count of values that have been added */
+ private double n = 0.0;
+
+ /** min of values that have been added */
+ private double min = Double.MAX_VALUE;
+
+ /** max of values that have been added */
+ private double max = Double.MIN_VALUE;
+
+ /** display name */
+ private String name = "";
+
+ /** Creates new univariate */
+ public Univariate() {
+ clear();
+ }
+
+ /** Creates a new univariate with the given name */
+ public Univariate(java.lang.String name) {
+ this.name = name;
+ clear();
+ }
+
+ /**
+ * Adds the value, updating running sums.
+ * Converts value to a double before adding.
+ * @param v the value to be added
+ */
+ public void addValue(int v) {
+ double f = (new Double(v)).doubleValue();
+ insertValue(f);
+ }
+
+ /**
+ * Adds the value, updating running sums.
+ * Converts value to a double before adding.
+ * @param v the value to be added
+ */
+ public void addValue(long v) {
+ double f = (new Double(v)).doubleValue();
+ insertValue(f);
+ }
+
+ /**
+ * Adds the value, updating running sums.
+ * Converts value to a double before adding.
+ * @param v the value to be added
+ */
+ public void addValue(float v) {
+ insertValue(v);
+ }
+
+ /**
+ * Adds the value, updating running sums.
+ * @param v the value to be added
+ */
+ public void addValue(double v) {
+ insertValue(v);
+ }
+
+ /**
+ * Returns the mean of the values that have been added
+ * @return mean value
+ */
+ public double getMean() {
+ // FIXME: throw something meaningful if n = 0
+ return sum/n;
+ }
+
+ /**
+ * Returns the variance of the values that have been added
+ * @return variance value
+ */
+ public double getVariance() {
+ double xbar = getMean();
+ // FIXME: throw something meaningful if n = 0
+ return (sumsq - xbar*xbar*n)/(n-1);
+ }
+
+ /**
+ * Returns the standard deviation of the values that have been added
+ * @return standard deviation value
+ */
+ public double getStandardDeviation() {
+ // FIXME: throw something meaningful if n = 0
+ return (new Double(Math.sqrt
+ ((new Double(getVariance())).doubleValue()))).doubleValue();
+ }
+
+ /**
+ * Adds the value, updating running sums.
+ * @param v the value to be added
+ */
+ private void insertValue(double v) {
+ n += 1.0;
+ if (v < min) min = v;
+ if (v > max) max = v;
+ sum += v;
+ sumsq += v*v;
+ }
+
+ /** Getter for property max.
+ * @return Value of property max.
+ */
+ public double getMax() {
+ return max;
+ }
+
+ /** Setter for property max.
+ * @param max New value of property max.
+ */
+ public void setMax(double max) {
+ this.max = max;
+ }
+
+ /** Getter for property min.
+ * @return Value of property min.
+ */
+ public double getMin() {
+ return min;
+ }
+
+ /** Getter for property n.
+ * @return Value of property n.
+ */
+ public double getN() {
+ return n;
+ }
+
+ /** Getter for property sum.
+ * @return Value of property sum.
+ */
+ public double getSum() {
+ return sum;
+ }
+
+ /** Getter for property sumsq.
+ * @return Value of property sumsq.
+ */
+ public double getSumsq() {
+ return sumsq;
+ }
+
+ /** Getter for property name.
+ * @return Value of property name.
+ */
+ public java.lang.String getName() {
+ return name;
+ }
+
+ /** Setter for property name.
+ * @param name New value of property name.
+ */
+ public void setName(java.lang.String name) {
+ this.name = name;
+ }
+
+ /**
+ * Generates a text report displaying
+ * univariate statistics from values that
+ * have been added.
+ * @return String with line feeds displaying statistics
+ */
+ public String toString() {
+ StringBuffer outBuffer = new StringBuffer();
+ outBuffer.append(name + "\n");
+ outBuffer.append("n: " + n + "\n");
+ outBuffer.append("min: " + min + "\n");
+ outBuffer.append("max: " + max + "\n");
+ outBuffer.append("mean: " + getMean() + "\n");
+ outBuffer.append("std dev: " + getStandardDeviation() + "\n");
+ return outBuffer.toString();
+ }
+
+ /** Resets all sums to 0, resets min and max */
+ public void clear() {
+ this.sum = 0.0;
+ this.sumsq = 0.0;
+ this.n = 0.0;
+ this.min = Double.MAX_VALUE;
+ this.max = Double.MIN_VALUE;
+ }
+
+}
diff --git a/src/test/org/apache/commons/math/FreqTest.java b/src/test/org/apache/commons/math/FreqTest.java
new file mode 100644
index 000000000..7453a563a
--- /dev/null
+++ b/src/test/org/apache/commons/math/FreqTest.java
@@ -0,0 +1,122 @@
+/* ====================================================================
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2003 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Commons", and "Apache Software
+ * Foundation" must not be used to endorse or promote products derived
+ * from this software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * .
+ */
+package org.apache.commons.math;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * Test cases for the {@link Freq} class.
+ *
+ * @author Phil Steitz
+ * @version $Revision: 1.1 $ $Date: 2003/05/12 19:04:38 $
+ */
+
+public final class FreqTest extends TestCase {
+ private long oneL = 1;
+ private long twoL = 2;
+ private int oneI = 1;
+ private int twoI = 2;
+ private String oneS = "1";
+ private String twoS = "2";
+ private double tolerance = 10E-15;
+
+ public FreqTest(String name) {
+ super(name);
+ }
+
+ public void setUp() {
+ }
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite(FreqTest.class);
+ suite.setName("Freq Tests");
+ return suite;
+ }
+
+ /** test freq counts */
+ public void testCounts() {
+ Freq f = new Freq("test counts");
+ assertEquals("total count",0,f.getSumFreq());
+ f.addValue(oneL);
+ f.addValue(twoL);
+ f.addValue(oneS);
+ f.addValue(oneI);
+ assertEquals("one frequency count",3,f.getCount("1"));
+ assertEquals("two frequency count",1,f.getCount("2"));
+ assertEquals("foo frequency count",0,f.getCount("foo"));
+ assertEquals("total count",4,f.getSumFreq());
+ f.clear();
+ assertEquals("total count",0,f.getSumFreq());
+ }
+
+ /** test pcts */
+ public void testPcts() {
+ Freq f = new Freq("test counts");
+ f.addValue(oneL);
+ f.addValue(twoL);
+ f.addValue(oneI);
+ f.addValue(twoI);
+ f.addValue("foo");
+ f.addValue("foo");
+ f.addValue("foo");
+ f.addValue("foo");
+ assertEquals("one pct",0.25,f.getPct("1"),tolerance);
+ assertEquals("two pct",0.25,f.getPct("2"),tolerance);
+ assertEquals("foo pct",0.5,f.getPct("foo"),tolerance);
+ assertEquals("bar pct",0,f.getPct("bar"),tolerance);
+ }
+}
+
diff --git a/src/test/org/apache/commons/math/MathTestSuite.java b/src/test/org/apache/commons/math/MathTestSuite.java
new file mode 100644
index 000000000..7e145abed
--- /dev/null
+++ b/src/test/org/apache/commons/math/MathTestSuite.java
@@ -0,0 +1,93 @@
+/* ====================================================================
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2003 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Commons", and "Apache Software
+ * Foundation" must not be used to endorse or promote products derived
+ * from this software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * .
+ */
+package org.apache.commons.math;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+/**
+ * Test suite for the Math package.
+ *
+ * @author Phil Steitz
+ * @version $Id: MathTestSuite.java,v 1.1 2003/05/12 19:04:38 rdonkin Exp $
+ */
+public class MathTestSuite extends TestCase {
+
+ /**
+ * Construct a new instance.
+ */
+ public MathTestSuite(String name) {
+ super(name);
+ }
+
+ /**
+ * Command-line interface.
+ */
+ public static void main(String[] args) {
+ TestRunner.run(suite());
+ }
+
+ /**
+ * Get the suite of tests
+ */
+ public static Test suite() {
+ TestSuite suite = new TestSuite();
+ suite.setName("Commons Math Tests");
+ suite.addTest(RealMatrixImplTest.suite());
+ suite.addTest(FreqTest.suite());
+ suite.addTest(UnivariateTest.suite());
+ return suite;
+ }
+}
diff --git a/src/test/org/apache/commons/math/RealMatrixImplTest.java b/src/test/org/apache/commons/math/RealMatrixImplTest.java
new file mode 100644
index 000000000..296a94925
--- /dev/null
+++ b/src/test/org/apache/commons/math/RealMatrixImplTest.java
@@ -0,0 +1,173 @@
+/* ====================================================================
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2003 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Commons", and "Apache Software
+ * Foundation" must not be used to endorse or promote products derived
+ * from this software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * .
+ */
+package org.apache.commons.math;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * Test cases for the {@link RealMatrixImpl} class.
+ *
+ * @author Phil Steitz
+ * @version $Revision: 1.1 $ $Date: 2003/05/12 19:02:53 $
+ */
+
+public final class RealMatrixImplTest extends TestCase {
+
+ private double[][] testData = { {1d,2d,3d}, {2d,5d,3d}, {1d,0d,8d} };
+ private double[][] testDataInv =
+ { {-40d,16d,9d}, {13d,-5d,-3d}, {5d,-2d,-1d} };
+ private double[][] testData2 ={ {1d,2d,3d}, {2d,5d,3d}};
+ private double[][] testDataPlusInv =
+ { {-39d,18d,12d}, {15d,0d,0d}, {6d,-2d,7d} };
+ private double[][] id = { {1d,0d,0d}, {0d,1d,0d}, {0d,0d,1d} };
+ private double[] testVector = {1,2,3};
+ private double entryTolerance = Math.pow(2,-64);
+ private double normTolerance = Math.pow(2,-64);
+
+ public RealMatrixImplTest(String name) {
+ super(name);
+ }
+
+ public void setUp() {
+
+ }
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite(RealMatrixImplTest.class);
+ suite.setName("RealMatrixImpl Tests");
+ return suite;
+ }
+
+ /** test dimensions */
+ public void testDimensions() {
+ RealMatrixImpl m = new RealMatrixImpl(testData);
+ RealMatrixImpl m2 = new RealMatrixImpl(testData2);
+ assertEquals("testData row dimension",3,m.getRowDimension());
+ assertEquals("testData column dimension",3,m.getColumnDimension());
+ assertTrue("testData is square",m.isSquare());
+ assertEquals("testData2 row dimension",m2.getRowDimension(),2);
+ assertEquals("testData2 column dimension",m2.getColumnDimension(),3);
+ assertTrue("testData2 is not square",!m2.isSquare());
+ }
+
+ /** test add */
+ public void testAdd() {
+ RealMatrixImpl m = new RealMatrixImpl(testData);
+ RealMatrixImpl mInv = new RealMatrixImpl(testDataInv);
+ RealMatrixImpl mPlusMInv = (RealMatrixImpl)m.add(mInv);
+ double[][] sumEntries = mPlusMInv.getData();
+ for (int row = 0; row < m.getRowDimension(); row++) {
+ for (int col = 0; col < m.getColumnDimension(); col++) {
+ assertEquals("sum entry entry",
+ testDataPlusInv[row][col],sumEntries[row][col],
+ entryTolerance);
+ }
+ }
+ }
+
+ /** test add failure */
+ public void testAddFail() {
+ RealMatrixImpl m = new RealMatrixImpl(testData);
+ RealMatrixImpl m2 = new RealMatrixImpl(testData2);
+ try {
+ RealMatrixImpl mPlusMInv = (RealMatrixImpl)m.add(m2);
+ fail("IllegalArgumentException expected");
+ } catch (IllegalArgumentException ex) {
+ ;
+ }
+ }
+
+ /** test norm */
+ public void testNorm() {
+ RealMatrixImpl m = new RealMatrixImpl(testData);
+ RealMatrixImpl m2 = new RealMatrixImpl(testData2);
+ assertEquals("testData norm",14d,m.getNorm(),entryTolerance);
+ assertEquals("testData2 norm",7d,m2.getNorm(),entryTolerance);
+ }
+
+ /** test m-n = m + -n */
+ public void testPlusMinus() {
+ RealMatrixImpl m = new RealMatrixImpl(testData);
+ RealMatrixImpl m2 = new RealMatrixImpl(testDataInv);
+ assertClose("m-n = m + -n",m.subtract(m2),
+ m2.scalarMultiply(-1d).add(m),entryTolerance);
+ }
+
+ /** test multiply */
+ public void testMultiply() {
+ RealMatrixImpl m = new RealMatrixImpl(testData);
+ RealMatrixImpl mInv = new RealMatrixImpl(testDataInv);
+ RealMatrixImpl identity = new RealMatrixImpl(id);
+ RealMatrixImpl m2 = new RealMatrixImpl(testData2);
+ assertClose("inverse multiply",m.multiply(mInv),
+ identity,entryTolerance);
+ assertClose("inverse multiply",mInv.multiply(m),
+ identity,entryTolerance);
+ assertClose("identity multiply",m.multiply(identity),
+ m,entryTolerance);
+ assertClose("identity multiply",identity.multiply(mInv),
+ mInv,entryTolerance);
+ assertClose("identity multiply",m2.multiply(identity),
+ m2,entryTolerance);
+ }
+
+ private void assertClose(String msg, RealMatrix m, RealMatrix n,
+ double tolerance) {
+ assertTrue(msg,m.subtract(n).getNorm() < tolerance);
+ }
+
+}
+
diff --git a/src/test/org/apache/commons/math/UnivariateTest.java b/src/test/org/apache/commons/math/UnivariateTest.java
new file mode 100644
index 000000000..ac271bcc2
--- /dev/null
+++ b/src/test/org/apache/commons/math/UnivariateTest.java
@@ -0,0 +1,115 @@
+/* ====================================================================
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2003 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Commons", and "Apache Software
+ * Foundation" must not be used to endorse or promote products derived
+ * from this software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * .
+ */
+package org.apache.commons.math;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * Test cases for the {@link Univariate} class.
+ *
+ * @author Phil Steitz
+ * @version $Revision: 1.1 $ $Date: 2003/05/12 19:02:53 $
+ */
+
+public final class UnivariateTest extends TestCase {
+ private double one = 1;
+ private float twoF = 2;
+ private long twoL = 2;
+ private int three = 3;
+ private double mean = 2;
+ private double sumSq = 18;
+ private double sum = 8;
+ private double var = 0.666666666666666666667;
+ private double std = Math.sqrt(var);
+ private double n = 4;
+ private double min = 1;
+ private double max = 3;
+ private double tolerance = 10E-15;
+
+ public UnivariateTest(String name) {
+ super(name);
+ }
+
+ public void setUp() {
+ }
+
+ public static Test suite() {
+ TestSuite suite = new TestSuite(UnivariateTest.class);
+ suite.setName("Freq Tests");
+ return suite;
+ }
+
+ /** test stats */
+ public void testStats() {
+ Univariate u = new Univariate("test univariate");
+ assertEquals("total count",0,u.getN(),tolerance);
+ u.addValue(one);
+ u.addValue(twoF);
+ u.addValue(twoL);
+ u.addValue(three);
+ assertEquals("N",n,u.getN(),tolerance);
+ assertEquals("sum",sum,u.getSum(),tolerance);
+ assertEquals("sumsq",sumSq,u.getSumsq(),tolerance);
+ assertEquals("var",var,u.getVariance(),tolerance);
+ assertEquals("std",std,u.getStandardDeviation(),tolerance);
+ assertEquals("mean",mean,u.getMean(),tolerance);
+ assertEquals("min",min,u.getMin(),tolerance);
+ assertEquals("max",max,u.getMax(),tolerance);
+ u.clear();
+ assertEquals("total count",0,u.getN(),tolerance);
+ }
+}
+