Change log for EJML

Date format: year/month/day

----- Version 0.23

2013/06/21

- Modified Matrix64F so that it can be serialized using beans.  Added setNumRows() and setNumCols()
- Added user configurable threshold in SolvePseudoInverseSvd

----- Version 0.22

2013/04/09

- Fixed bug in MatrixFeatures.isPositiveDefinite() where the input was being modified
  * Added a check for isModified() flag in this and several other functions
  * Thanks Eriklan Dodinh for reporting the bug
- MatrixIO.loadCSV() now will throw IOException() if an incorrect matrix size is specified
  * Thanks Ioannis P. for reporting this bug
- LUDecompositionNR now returns false for singular matrices.
  * Thanks Luke Nezda for reporting the bug
- Moved LUDecompositionNR into experimental directory since its use is not recommended, but is still a good algorithm.
- Clarified ordering of coefficients in polynomial root example
  * Thanks Rahul for getting confused by the lack of documentation

----- Version 0.21

2012/12/04

- Removed Android build option from ant because there is no need for such an option
- Changed behavior of CommonOps.rref() so that numUnknowns <= 0 causes it to be set to a reasonable default
- Fixed bug in SimpleSVD where getSingularValue() did not return ordered singular values
- SingularOps.nullVector() now lets you specify if it is the left or right null space
- Added SafeSvd, which is a wrapper class that ensures that the input to SVD is not modified

----- Version 0.20

2012/08/22

- Fixed bug in SingularOps.nullity where it did not handle wide matrices correctly. 
  * Thanks arnavkumar for pointing out the bug
- Reworked null-space
  * SingularOps.nullSpace() is now nullVector()
  * SingularOps.nullSpace now returns the entire null space not just one vector
  * Thanks arnavkumar for pointing out the non-standard implementation
- Changed behavior of MatrixFeatures.isDiagonalPositive() so that it will return false if NaN is found
- Under certain conditions SvdImplicitQrDecompose will use BidiagonalDecompositionTall instead of the default
  algorithm.
- Moved factories and related interfaces into their own package outside of the "alg" package, which was intended for
  specific implementations.
- DecompositionFactory has been cleaned up by reducing the number of functions, making input parameters more consistent,
  and improved JavaDoc
- Changed CommonOps.set(matrix,value) to CommonOps.fill(matrix,value)
- Added function QRPDecomposition.setSingularThreshold() so that the user has more control over this important threshold
  * The singular threshold in QRP is now absolute and not automatically relative.
  * To replicate the original behavior do the following:
       decomp.setSingularThreshold( CommonOps.elementMaxAbs(A)*UtilEjml.EPS )
- SvdImplicitQrDecompose now takes in a parameter which specifies if tall bidiagonal decomposition can be used over
  concerns of its stability.  These concerns are mostly theoretical since a few simple tests show the stability to be
  almost the same.
- SimpleBase now implements Serializable
- Accessors in SingularValueDecomposition now can take in an optional storage matrix.
- Removed support for LinearSolver with Gauss-Jordan elimination
  * The provided implementation was very slow and didn't utilize any of the advantages of GJ
- Added support for transforming an augmented matrix into Reduced Row Echelon Form (RREF)
  * Implementation using Gauss-Jordan with row pivots
  * Added CommonOps.rref()

----- Version 0.19

2012/04/23

- Added example showing file IO to examples directory
- Changed MatrixIO.saveXML and MatrixIO.loadXML to saveBin and loadBin because it uses a binary format not XML
- Added save/load CSV to SimpleBase
- Implemented VectorVectorMult.rank1Update
  * Before the function did nothing
- Fixed bug in LinearSolverQrHouseCol where it was not handled a change in matrix size correctly
- Added new variant of SingularOps.descendingOrder() which takes an array of singular values as input
- Added reshape(row,cols) because adding false to reshape(row,cols) all the time was annoying me.
- Added multInner() and multOuter() for performing inner and outer matrix products.  Faster than
  using generalized algorithms.
- Changed behavior of VectorVectorMult.innerProdA so that it does not require 'A' to be square
- Improved Pseudo Inverse
  * Refactored by changing package and renaming
  * Added QR pivot based pseudo inverse classes
- Improved QR Pivot so that it has better stability
  * Normalization is done on a column by column basis instead of by the whole matrix.
- QR decomposition using extracted columns now invokes more generalized code for householder operations
  * Should improve performance for larger matrices, and slightly degrade for small
- Added SimpleMatrix.setRow() SimpleMatrix.setColumn()
  * Writes elements in an array to a row/column.
- Moved decomposition and linear solver factories and interfaces into a factories package.
  * Was placed in alg.dense package, which is for specific implementations

----- Version 0.18

2011/12/04

- Added support for reading and writing CSV formatted matrices
  * Requested by various people.
- Changed SolvePseudoInverse to use SVD, making it much more robust and will never fail now.
  * Same behavior as matlab pinv() function
  * Requested by mwolff.
  * Updated CommonOps.pinv() to use SolvePseudoInverse
  * Added pinv() to SimpleMatrix
- Added getSingularValue() to SimpleSVD class.
- Rewrote JavaDOC for reshape() because it was miss leading
  * sh10151 pointed this out
- Removed one of the CommonOps.insert() functions since it was identical to CommonOps.extract()
- Created optimized versions of CommonOps.extract
  * Seems to boost performance on small matrices but not large
- Added QR decomposition with column pivots
- Added solver which uses QR with column pivots
- BidiagonalDecompositionTall now passes all of its unit tests

----- Version 0.17

2011/06/28

- Moved general and symmetric EVD to DecompositionFactory from EigenOps
- Moved show() from MatrixIO to MatrixVisualization to help with Android development.
  * added "jar nogui" to ant build script which will exclude GUI related files.
- Added CommonOps.elementDiv()
  * Thanks to leokury for the suggestion
- Many functions now handle NaN more intelligently in MatrixFeatures
  * Thanks to kaspar.thommen for pointing out these flaws.
- Adding Maven support
  * Can now download from the central repository
  * Requested by soren
- Added sumRows() and sumCols() to CommonOps
  * Requested by b.broeksema
- Fixed bug in inducedP2 where the max singular value was not always returned
  * Found by Antonino Freno

----- Version 0.16

2011/02/23

- Removed SVD code based on NR
- Fixed bug in BlockMatrix64HouseholderQR.applyQ()
 * improved unit test to detect the bug
- Changed contract for LinearSolver and added functions to determine if the input
  is being modified or not.
- Genericified LinearSolver
  * Removed LinearBlockSolver
- Genericified DecompositionInterface
  * Removed block decomposition interfaces
- Clarified behavior of functions in MatrixFeatures.
- Added EjmlUnitTests
  * converted many internal unit tests to use this class
- Changed MatrixIO to take a PrintStream as an input
- Adding support for toString()
- EVD and SVD now modify their inputs by default
- Added unit test for PCA
- Added in-place converting to and from row-major to block matrices.
- Trangular block solver can handle unaligned input
- Modified isIdentical and added isEquals to MatrixFeatures.
  * Resulting from a discussion with Kaspar Thommen
- SimpleMatrix has been made more easy to extend by adding a protected function that declares
  new instances of SimpleMatrix. Now function calls will return the correct type.
- TridiagonalSimilarDecomposition is now an interface and related code has been made more
  general purpose.
- Added a QR decomposition that supports bidiagonalization for tall matrices
  * Results in significantly faster SVD when U is not needed.
  * Not used yet in SVD because QR decomposition without column pivots is unstable for singular matrices.
- Modified BidiagonalizeDecomposition interface
- SVD and EVD QR algorithm take in diagonal and off diagonal as inputs not the matrix.
- Added dense matrix copy triangle and isEqualsTriangle
- Changed logo to more accurately represent a Householder reflector.
- Pushed SimpleMatrix into its own package.
  * To make it easy to extend, SimpleMatrix now extends SimpleBase
  * Added dot() and isVector() is SimpleMatrix.
- LinearSolverFactory and DecompositionFactory now take in the matrix's size
- SimpleMatrix now accepts variable arguments.

----- Version 0.15

2010/11/20

- Minor speed ups in LU, determinant, transpose
- Fixed a bug in MatrixComponent.  Negative elements were not handled correctly.
- More clearly defined what LinearSolver.quality() is and made it invariant of the matrix's scale.
- Added wrap to DenseMatrix64F for handling raw data.
- Added PrincipleComponentAnalysis example
- Changed DecompositionInterface
- Added unsafe_get() and unsafe_set() to Matrix64F and implementing classes.
- Cholesky and QR decompositions for a block matrix and associated helper functions.
- Simplistic functions have had the hand inlining removed. Suggested by Kaspar Thommen.
  * After marking it was found that sometimes more complex functions had their performance
    significantly degraded after they started to use very light weight wrappers.
  * In some cases it seems to slightly improve performance when setters/getters are used.
  * Yes these changes were statistically significant.
- Changed behavior of CommonOps.extract() to make its behavior match other submatrix operations better
- Added the ability to create a new matrix if a null dst is provided in several CommonOps functions.
- Moved examples into their own java package.  Makes selectively running those unit tests easier in IntelliJ
- Added elementMult() to SimpleMatrix. Suggested by Nikita Rokotyan.
- Fixed bug in the different QR decomposition implementations for compact QR.
  * Added compact QR to generic tests
- Fixed bug in LinearSolverFactory.symmetric() where LU instead of cholesky was being created.
- EjmlParameters.MEMORY provides a way for it to select algorithms which are fast but memory hogs or
  slower but more memory efficient.

----- Version 0.14

2010/08/07

- Removed left over debugging print statement from SvdImplicitQrAlgorithm.
- For reflectors (used in QR) code has been added that can switch between two normalization
  methods.  This can significant speed things up and improve accuracy.
- Added underflow stability benchmarks for some decompositions
- Correct some issues in SVD and Symm EVD
- Seed up SVD by removing need for some divisions
- Symm EVD now uses the Wilkinson shift
- Fixed a bug in kron().
- Added several new functions to SimpleMatrix and cleaned up function names.
- Fixed a bug in QR decomposition where compact flag was incorrectly handled.
- Added QRExample* to example source code to demonstrate using extract and insert
- All QR decompositions now works on matrices with any shape
- Added set() to MatrixIterator
- Added additional checks to matrix multiply that makes sure 'c' is not the same matrix as 'a' or ''b'
  - Suggested by xcolwell
- Moved IO functions to MatrixIO
  - Provide a way to save/read DenseMatrix64F and SimpleMatrix to/from a file.
- Fixed and added more block matrix operations.
- Creates a new class to store transpose algorithms.
   * Including a new block one that is about 40% faster on large non-square matrices.
- Added quality() to LinearSolver to provide a quick way to validate results.
- Added MatrixIO.show() for visually showing a matrix's state.

----- Version 0.13

2010/07/08

- Fixed SingularOps.descendingOrder() bug.
   * Thanks xcolwell for reporting it.
- Fixed a bug in RandomMatrices.createOrthogonal()
- Cleaned up Matrix64F and D1Matrix64F
- Updated java doc for several classes
- Added SVD and EVD to SimpleMatrix
- SVD can now selectively compute U and V
- SVD is computed all at once.
   - Seems to perform slightly faster than original code and is simpler.
   - There is a loss in performance for 2 by 2 matrices.  
- SVD getU() and getV() can now indicate if the transpose is returned or not.
- SVD fixed issue dealing with very small numbers canceling out and causing a divided by zero error
- SVD changed exceptional shift to use a random rotation
- Moved quality() functions inside of DecompositionFactory
- Symmetric EVD
  * Fixed rare problem that could happen if two eigenvalues are identical and off diagonal element is small it will never converge.
  * Added code to make it more robust to very small numbers
- Generic EVD
  * Fixed long standing issue with eigenvectors and repeat eigenvalues
  * Made unit test tolerant to small round off errors causing an eigen value to become imaginary
- Added a version string to UtilEjml



----- Version 0.12

2010/06/17

- Added PolynomialFit example code.
- Updated comments to reflect the addition of LinearSolvers
- Added MatrixIterator to provide another way of accessing elements inside a matrix
- Can just compute eigenvalues.
- Fixed an array index out of bounds error when computing general eigenvectors
- Improved accuracy of general EVD when computing eigenvalues and eigenvectors
  when dealing with nearly identical eigenvalues.  Thanks to Ex'ratt for finding this and the previous problem.
- Auto code for unrolling determinant by minor.
- Auto code generator for unrolling inverse by minor
- Created experimental code directory
  
----- Version 0.11

2010/04/07

- Updated LevenbergMarquardt example.
- Added the ability to save the old data in reshape() if the matrix grows in size.
- Added Kronecker product
- Added LinearSolverFactory
- Changed constructor in DenseMatrix64F so that var-args can be used.
- Can add random numbers to a matrix
- Added null space to SingularOps
- Added a function in SingularOps to rearrange the SVD such that the singular values are in descending order.

----- Version 0.10.1

2010/02/18

- Fixed a bug with large symmetric matrices where eigen pairs would be incorrectly associated with each other.
- Made the general eigenvalue decomposition algorithm less buggy.  It can now handle the case where
  eigenvalues appear in a different order the second time, but doesn't solve for repeat values correctly.

----- Version 0.10

2010/02/16

- fixed a LU pivot matrix bug
- SVD Implicit QR algorithm (much faster than old)
- Optimized rank1update for large matrices
- Various refactoring and other tweaks.

----- Version 0.9

2010/01/29

- Added the QR Algorithm for eigenvalue decomposition for Symmetric matrices.
- improved eigenvalue unit tests exposing some problems with generic EVD
- various refactoring

----- Version 0.8

2010/01/15

- Usability improvements
- Fixed matrix multiply switching rules for some of the operators
- Added automatic switching to matrix vector multiply to some operators in CommonOps
- More random matrices: orthonormal, orthogonal, normal span, and with specific singular values.
- More matrix norms, including induced norms and all the p vector norms.
- Eigenvalue decomposition for general matrices.
- More functions in EigenOps and preexisting ones improved
- LU now works for rectangular matrices
- LU now generates a pivot matrix (I guess it is really PLU)
- various refactoring

----- Version 0.7

2009/11/10

- Created a linear solver interface.
- QR Update.
  * Two implementations.  One is more straight forward and the other is much faster.
- Created a linear solver interface that allows data points to be added and removed.
- Made decomposition and linear solver algorithms use lazy initialization.

----- Version 0.6

2009/10/26

- Added QR Decomposition
- Added Leibniz formula for determinants.
  * This required a permutation algorithm to be added also.
- Fixed various bugs
- Improved SimpleMatrix to make it more useful


----- Version 0.5

2009/9/19

- Added another type of matrix multiplication that creates a temporary column
  * This significant improved performance in some areas

----- Version 0.4

2009/9/5

- Added two more Cholesky decomposition algorithm; block and LDL.
- Moved significant magic numbers in to EjmlParamters to provide a central place for configuration.
- Various other refactorings and bug fixes.

----- Version 0.3

2009/8/27

- This is the initial public distribution.  Has most of the final functionality.
