Apache Commons Math 3.3 RELEASE NOTES The Apache Commons Math team is pleased to announce the release of commons-math3-3.3. The Apache Commons Math project is a library of lightweight, self-contained mathematics and statistics components addressing the most common practical problems not immediately available in the Java programming language or commons-lang. This is a minor release: It combines bug fixes and new features. Changes to existing features were made in a backwards-compatible way such as to allow drop-in replacement of the v3.x JAR file. Most notable among the new features are: Framework for creating artificial neural nets, self organizing feature maps, computational geometry algorithms (convex hull, enclosing ball), performance improvements of the linear simplex solver, refactoring of curve fitters, low-discrepancy random generators (sobol, halton), least-squares fitting. The minimum version of the Java platform required to compile and use Commons Math is Java 5. Users are encouraged to upgrade to this version as this release not only includes bug fixes but also deprecates numerous classes and methods that will be deleted from the next major release (4.0). Caveat: 1. The implementation of the BOBYQA optimization algorithm is in alpha state (cf. MATH-621): Many code paths are untested, and we are looking for volunteers to improve the code readability, robustness and performance and to extend the unit tests suite. 2. A few methods in the FastMath class are in fact slower that their counterpart in either Math or StrictMath (cf. MATH-740 and MATH-901). 3. A few methods/constructors in the package o.a.c.m.geometry.partitioning have changed their signature in a non backwards-compatible way. The respective classes are intended to be package private only and are not supposed to be used for other purposes. Changes in this version include: New features: o N/A: Added an order 6 fixed-step ODE integrator designed by H. A. Luther in 1968. o MATH-1110: Added new constructor to "OLSMultipleLinearRegression" to be able to specify a custom singularity threshold for QR decomposition. Thanks to Edward Segall. o MATH-1119: Added a fast single-step method for fixed-step Runge-Kutta integrators. o MATH-1101: Improved documentation of QR decomposition handling of singular matrices. o MATH-1053: QR decomposition can compute pseudo-inverses for tall matrices. Thanks to Sean Owen. o MATH-820: Field vectors now implement the visitor pattern just like real vectors. o MATH-749: Added MonotoneChain algorithm to compute the convex hull of a collection of points in 2D. Additionally, the AklToussaintHeuristic can be used to speed up the generation. o MATH-1095: Added Emo Welzl algorithm to find the smallest enclosing ball of a collection of points. o MATH-1072: Added a constructor to "AbstractListChromosome" that does not copy the input argument. o MATH-1091: BSP tree now provides an API to compute a global signed distance from a test point to the region. The distance is positive if the point is outside of the region, negative if the point is inside, and zero when the point is at the boundary. The distance is continuous everywhere, so it can be used with a root solver to identify accurately boundary crossings. This API is available for all BSP trees, in Euclidean and spherical geometries, and in all dimensions. o N/A: Added new geometry sub-packages: spherical.oned which deals with geometry on the 1-sphere (i.e. the circle) and spherical.twod which deals with the 2-sphere (i.e. the regular sphere). BSP trees can be used in these new spaces, so one can build arcs sets and spherical polygons sets with all the regular operations (inside/outside/boundary checks, union, intersection, symetric difference, complement ...). o MATH-1090: IntervalsSet now implements Iterable, so one can iterate over the sub-intervals without building a full list containing a copy of everything beforehand. o MATH-923: Utilities for creating artificial neural networks (package "o.a.c.m.ml.neuralnet"). Implementation of Kohonen's Self-Organizing Feature Map (SOFM). o MATH-1014: Refactoring of curve fitters (package "o.a.c.m.fitting"). o MATH-970: Added possibility to retrieve the best found solution of the "SimplexSolver" in case the iteration limit has been reached. The "optimize(OptimizationData...)" method now supports a "SolutionCallback" which provides access to the best solution if a feasible solution could be found (phase 2 of the Two-Phase simplex method has been reached). o MATH-1061: Added InsufficientDataException. o MATH-983: Added a graphical overview of available continuous distributions to the userguide. o MATH-1051: Added Kendall's tau correlation (KendallsCorrelation). Thanks to Matt Adereth,devl. o MATH-1036: Added SparseGradient to deal efficiently with first derivatives when the number of variables is very large but most computations depend only on a few of the variables. Thanks to Ajo Fod. o MATH-1038: Added ConfidenceInterval class and BinomialConfidenceInterval providing several estimators for confidence intervals for binomial probabilities. Thanks to Thorsten Schäfer. o MATH-1004: Added new methods to compute the inverse of a matrix to "DiagonalMatrix" and "MatrixUtils". Thanks to Ajo Fod. o MATH-1041: "Pair": added factory method and "toString" method. Thanks to Sean Owen. o MATH-1002: "AbstractUnivariateStatistic.test(...)" methods have uses outside subclasses; implementation moved to MathArrays.verifyValues(...). o MATH-1034: Added exact binomial test implementation. Thanks to Thorsten Schäfer. o MATH-1018: Added overloaded constructors for subclasses of "RealDistribution" implementations which do not require an explicit "inverseCumulativeAccuracy". The default accuracy will be used instead. Thanks to Ajo Fod. o MATH-1001: Added overloaded methods for "Frequency#incrementValue(Comparable, long)" with int, long and char primitive arguments. Thanks to sebb. o MATH-1030: Added a section to the userguide for the new package o.a.c.m.ml with an overview of available clustering algorithms and a code example. Thanks to Thorsten Schäfer. o MATH-1028: Added new distance metric "EarthMoversDistance". Thanks to Thorsten Schäfer. o MATH-1025: Added CombinatoricsUtils to the util package, moving binomial coefficients, factorials and Stirling numbers there and adding a combinations iterator. o MATH-991: "PolynomialSplineFunction": added method "isValidPoint" that checks whether a point is within the interpolation range. o MATH-989: "BicubicSplineInterpolatingFunction": added method "isValidPoint" that checks whether a point is within the interpolation range. o MATH-1010: Utility to shuffle an array. o MATH-1008: Created package ("o.a.c.m.fitting.leastsquares") for least-squares fitting, with implementations of "LevenbergMarquardtOptimizer" and "GaussNewtonOptimizer" adapted to a new ("fluent") API. o MATH-1007: Add mode function to StatUtils class. o MATH-1000: Add mode function to Frequency class. o MATH-997: Implemented Gauss-Hermite quadrature scheme (in package "o.a.c.m.analysis.integration.gauss"). o MATH-967: Added midpoint integration method. Thanks to Oleksandr Kornieiev. o MATH-851: Added method "MathArrays#convolve(double[], double[])" to compute the discrete, linear convolution of two sequences. Thanks to Clemens Novak. o MATH-977: Added low-discrepancy random generator "HaltonSequenceGenerator". o MATH-826: Added low-discrepancy random generator "SobolSequenceGenerator". Thanks to Sam Halliday. o MATH-973: Added "GeometricDistribution" to "o.a.c.m.distribution" package. Thanks to Mauro Tortonesi. o MATH-968: Added "ParetoDistribution" to "o.a.c.m.distribution" package. Thanks to Alex Gryzlov. o MATH-898: Added "FuzzyKMeansClusterer" to "o.a.c.m.ml.clustering" package. Fixed Bugs: o N/A: Fixed an issue with noisy functions for ODE events detection. o MATH-1092: Extracted class "LineSearch" from "PowellOptimizer", to be used in "NonLinearConjugateGradientOptimizer" (in place of the implementation that triggered this issue). o MATH-1115: Build properly empty polyhedrons set when given equal min/max boundaries. Also explained better in the javadoc about some wrong usage of PolyhedronsSet constructor. o MATH-1117: Build properly empty polygons set when given equal min/max boundaries. Also explained better in the javadoc about some wrong usage of PolygonsSet constructor. o MATH-1118: "Complex": Fixed compatibility of "equals(Object)" with "hashCode()". Added new methods for testing floating-point equality between the real (resp. imaginary) parts of two complex numbers. o MATH-1107: Prevent penalties to grow multiplicatively in CMAES for out of bounds points. Thanks to Bruce A Johnson. o MATH-875: Un-deprecated RealVector.sparseIterator, documenting explicitly that entries not iterated above are the zero ones. o MATH-821: Relaxed specification for function mapping on vectors, thus allowing straightforward implementation for sparse vectors. o MATH-1065: Calculating the inverse cumulative probability of an "EnumeratedRealDistribution" will now return the correct result according to the selected enumerated probability mass function. Thanks to matteodg. o MATH-976: Create additional artifact "commons-math3-x.y.z-tools.jar" as part of the release process. This artifact contains useful tools, e.g. for performance testing. o MATH-990: Improved performance of "MathArrays#sortInPlace(...)". o MATH-1044: Clarify javadoc of "DecompositionSolver#getInverse()" and corresponding implementations wrt the actually returned inverse. Several decomposition implementations are able to return a pseudo-inverse in case of a singular matrix. Thanks to Sean Owen. o MATH-985: Fixed an indexing problem in "BicubicSplineInterpolatingFunction" which resulted in wrong interpolations. Thanks to Johnathan Kool. o MATH-1089: "Precision#round(double, ...)" will now return negative zero for negative values rounded to zero, similar to the float variant. o MATH-1088: The iterator returned by "MultiDimensionalCounter#iterator()" will now correctly throw a "NoSuchElementException" when calling "next()" and the iterator is already exhausted. o MATH-1082: The cutOff mechanism of the "SimplexSolver" in package o.a.c.math3.optim.linear could lead to invalid solutions. The mechanism has been improved in a way that the tableau does not need to be updated anymore. Additionally, a new check will prevent impossible solutions to be returned as valid. o MATH-1079: Improved performance of "SimplexSolver" in package o.a.c.math3.optim.linear by directly performing row operations and keeping track of the current basic variables. o MATH-842: Added support for different pivot selection rules to the "SimplexSolver" by introducing the new "OptimizationData" class "PivotSelectionRule". Currently supported rules are: Dantzig (default) and Bland (avoids cycles). o MATH-1070: Fix "Precision#round(float, int, int)" when using rounding mode "BigDecimal.ROUND_UP" and the discarded fraction is zero. Thanks to Oleksandr Muliarevych. o MATH-1059: Use "FastMath" instead of "Math" within Commons Math. o MATH-1068: Avoid overflow when calculating Kendall's correlation for large arrays. Thanks to Gal Lalouche. o MATH-1067: Avoid infinite recursion in "Beta.regularizedBeta" (package "o.a.c.m.special"). Thanks to Florian Erhard. o MATH-1056: Fixed unintended integer division error in PoissonDistribution sampling method. Thanks to Sean Owen. o MATH-1057: Fixed failing unit tests for "BOBYQAOptimizer" when executed with a Oracle/Sun JVM 1.5. o MATH-1062: A call to "KalmanFilter#correct(...)" may have resulted in "NonSymmetricMatrixException" as the internally used matrix inversion method was using a too strict symmetry check. o MATH-1058: Precision improvements (for small values of the argument) in "Beta" function and in "LogNormalDistribution" and "WeibullDistribution". Thanks to Sean Owen. o MATH-1055: Fixed some invalid links inside javadoc and added missing deprecated annotations. Thanks to Sean Owen. o MATH-1051: "EigenDecomposition" may have failed to compute the decomposition for certain non-symmetric matrices. Port of the respective bugfix in Jama-1.0.3. o MATH-1047: Check for overflow in methods "pow" (class "o.a.c.m.util.ArithmeticUtils"). o MATH-1045: "EigenDecomposition": Using tolerance for detecting whether a matrix is singular. Thanks to Sean Owen. o MATH-1035: Simplified and improved performance of "ArithmeticUtils#addAndCheck(long, long)". Thanks to derphead. o MATH-1029: The "BigFraction" constructor will throw a "FractionConversionException" also in case negative values are provided which exceed the allowed range (+/- Integer.MAX_VALUE). o MATH-1033: The "KalmanFilter" wrongly enforced a column dimension of 1 for the provided control and measurement noise matrix. Thanks to Yuan Qu. o MATH-1037: Fix a typo in the test class of "GeometricDistribution" and ensure that a meaningful tolerance value is used when comparing test results with expected values. Thanks to Aleksei Dievskii. o MATH-996: Creating a "Fraction" or "BigFraction" object with a maxDenominator parameter does not throw a "FractionConversionException" anymore in case the value is very close to fraction. Thanks to Tim Allison. o MATH-999: Improve performance of "DiagonalMatrix#preMultiply(RealVector)". Thanks to Ajo Fod. o MATH-1021: Fixed overflow in "HypergeometricDistribution". Thanks to Brian Bloniarz. o MATH-1020: Fixed "nextPermutation" method (in "o.a.c.m.random.RandomDataGenerator"). This bug does not affect applications using a previous version of Commons Math. o MATH-1019: Buggy (private) method "shuffle" in "o.a.c.m.random.RandomDataGenerator" superseded by "MathArrays.shuffle" (cf. MATH-1010). o MATH-1012: Created "RandomGeneratorFactory" (package "o.a.c.m.random") to reduce code duplication in "RandomDataGenerator". o MATH-1005: Fixed "MathArrays.linearCombination" when array length is 1. Thanks to Roman Werpachowski. o MATH-993: In "GaussNewtonOptimizer", check for convergence before updating the parameters estimation for the next iteration. o MATH-988: Fixed NullPointerException in 2D and 3D sub-line intersections. Thanks to Andreas Huber. o MATH-962: Added clarification to the javadoc of "VectorFormat" and derived classes in case "," is used as a separator. o MATH-965: Fixed inconsistent dimensions preventing use of secondary states in ODE events. Changes: o N/A: Bracketing utility for univariate root solvers returns a tighter interval than before. It also allows choosing the search interval expansion rate, supporting both linear and asymptotically exponential rates. o MATH-437: Added KolmogorovSmirnovTest class, deprecating KolmogorovSmirnovDistribution. o MATH-1099: Make QR the default in GaussNewtonOptimizer. Thanks to Evan Ward. o MATH-1099: Add Cholesky option to GaussNewtonOptimizer. Thanks to Evan Ward. o MATH-1099: Make QR in GaussNewton faster and more accurate. Thanks to Evan Ward. o MATH-870: The sparse vector and matrix classes have been un-deprecated. This is a reversal of a former decision, as we now think we should adopt a generally accepted behavior which is ... to ignore the problems of NaNs and infinities in sparse linear algebra entities. o MATH-1050: Deprecated "ArithmeticUtils#pow(int, long)" and "ArithmeticUtils#pow(long, long)" in favor of corresponding methods "ArithmeticUtils#pow(..., int)". o MATH-1080: The "LinearConstraintSet" will now return the enclosed collection of "LinearConstraint" objects in the same order as they have been added. o MATH-1031: Added new class "ClusterEvaluator" to evaluate the result of a clustering algorithm and refactored existing evaluation code in "MultiKMeansPlusPlusClusterer" into separate class "SumOfClusterVariances". Thanks to Thorsten Schäfer. o MATH-1039: Added logDensity methods to AbstractReal/IntegerDistribution with naive default implementations and improved implementations for some current distributions. Thanks to Aleksei Dievskii. o MATH-1011: Improved implementation of "sample" method of "UniformIntegerDistribution". o MATH-1006: Enabled LaTeX expressions in javadoc and site docs via MathJax. o MATH-995: Documented limitation of "IterativeLegendreGaussIntegrator" (added warning about potential wrong usage). o MATH-987: Added append method to SimpleRegression, making this class map/reducible. Thanks to Ajo Fod. o MATH-978: Added append method to StorelessCovariance, making this class map/reducible. Thanks to Ajo Fod. For complete information on Apache Commons Math, including instructions on how to submit bug reports, patches, or suggestions for improvement, see the Apache Commons Math website: http://commons.apache.org/proper/commons-math/