oj! Algorithms v39.0.0 Release Notes

Release Date: 2015-11-28 // almost 7 years ago
  • ๐Ÿ”„ Changed

    ๐Ÿšš >Everything (wasn't much) that made use of code outside the JRE profile "compact1" has been removed from ojAlgo. In terms of library functionality nothing has been removed, but there could be incompatibilities.


    • ๐Ÿšš Each of Access1D, Access2D and AccessAnyD now has a new nested interface Settable. The "set" methods of the Fillable interfaces are moved to Settable. Fillable and Modifiable now both extend Settable. The Settable interface declares "add" methods to complement "set". The Fillable interface now declares a set of "fillMatching" methods (moved up from some lower level implementations).
    • ๐Ÿ—„ The structure() method of AccessAnyD is deprecated and replaced with shape() that does exactly the same thing.
    • ๐Ÿ“ฆ The previously package private interfaces Structure1D, Structure2D and StructureAnyD are now public.
    • ๐Ÿ†• New interfaces Access1D.Sliceable, Access2D.Sliceable and AccessAnyD.Sliceable.


    • ๐Ÿ†• New package containing abstract algebra interfaces. This doesn't add any new features to ojAlgo. It just formalises and unifies some of the definitions. There are interfaces for Group, Ring, Field, VectorSpace...


    • ๐Ÿ“ฆ BasicMatrix now extends NormedVectorSpace from the new algebra package.
    • ๐Ÿ“ฆ MatrixStore now extends NormedVectorSpace from the new algebra package.
      • The method scale(Number) is deprecated and replaced by multiply(Number).
      • Refactoring of the MatrixStore hierarchy (their methods) due to api changes caused by the new algebra package. There are some new implementations and methods have been moved up and down the hierarchy.
    • ๐Ÿ—„ The methods isLowerLeftShaded() and isUpperRightShaded() of MatrixStore are deprecated and replaced by firstInRow(int), firstInColumn(int), limitOfRow(int) and limitOfColumn(int).
    • The roles of the ElementsConsumer and ElementsSupplier interfaces have been greatly expanded. ElementsSupplier is now a superinterface to MatrixStore and it gained additional features. The ElementsConsumer largely defines the extensions to MatrixStore that make out the PhysicalStore interface.
    • ๐Ÿ”จ Refactoring of the MatrixDecompostion hierarchy (the org.ojalgo.matrix.decomposition package):
      • The capabilities of the various decompositions have been factored out to new/separate interfaces.
      • Integrated/merged the decomposition implementations from JAMA. (They've always been part of ojAlgo, but they were now moved, renamed and refactored.)
      • Performance tuning.
      • Matrix decompositions can now accept ElementsSupplier:s as input.


    • ๐Ÿ“ฆ All MatrixStore implementations (except the PhysicalStore implementations) are now package private. All constructors, factory methods or instances are now either removed och made package private.
    • ๐Ÿ— There is a new MatrixStore.Factory interface (as well as implementations for BIG, COMPLEX and PRIMITIVE). Through this new factory, and the previously existing, MatrixStore.Builder, you can access all features available with/by the various MatrixStore implementations.
    • ๐Ÿ— The MatrixStore.Builder has been cleaned of any methods that would require calculations on the matrix elements.
    • The method multiplyLeft now returns an ElementsSupplier rather than a MatrixStore (a MatrixStore is an ElementsSupplier and you get a MatrixStore from any ElementsSupplier by calling "get")
    • Some methods defined in the MatrixDecomposition interface now take an ElementsSupplier as input rather than an Access2D or a MatrixStore.
    • MatrixStore now extends Access2D.Sliceable.


    • ๐Ÿ“œ There is a new SparseStore class (a MatrixStore implementation)
    • โž• Additions to MatrixUtils that get/copy the real, imaginary, modulus and argument properties of ComplexNumber matrices into primitive double valued matrices.


    • ๐Ÿ”จ Refactoring related to BasicLogger and CharacterRing. In particular it is now possible (easier) to use a CharacterRing as a buffering BasicLogger.Printer.


    • ๐Ÿ›  Fixed a problem where you could get a NullPointerException with debug logging in the ConvexSolver.
    • ๐Ÿ”„ Changed the behaviour of the ConvexSolver (ActiveSetSolver) initialisation so that it now initiates to the optimal solution of the linear part of the model rather than any other feasible solution.
    • ๐Ÿ‘Œ Improved the presolve functionality of ExpressionsBasedModel to identify and eliminate some degenerate constraints.
    • Modified how the initial solution extracted from the ExpressionsBasedModel is composed. Variable constraints are now considered to ensure feasibility. This primarily effects how the ConvexSolver is initialised.
    • ๐Ÿš€ It is now possible to register solver integrations with the ExpressionsBasedModel. In other words; it is now possible to use third party solvers with ojAlgo's modelling tools. We've already built a basic CPLEX integration. The plan is to build a couple more and to release them all as Open Source here at GitHub.
    • Optimisation.Options.slack changed from 14,8 to 10,8 and the logic for how the ExpressionsBasedModel validates a solution changed slightly.
    • ๐Ÿ‘€ The ConvexSolver is now deterministic! For many years the ConvexSolver (previously QuadraticSolver) incorporated an element of randomness to break out of possible indefinite cycles. With numerically difficult problems this "feature" could result in varying solutions between subsequent solves - confusing. This strategy has now been replaced by a deterministic one that seems to work equally well, and being deterministic it is obviously much better.
    • Slightly modified how the model parameters are scaled before being sent to a solver.
    • ๐Ÿ”จ ExpressionsBasedModel now accepts presolver plugins. The existing presolve functionality has been refactored to plugin implementations that can be individually turned on/off. It is possible for anyone to write an additional plugin.
    • ๐Ÿ”จ Refactoring and deprecations in ExpressionsBasedModel. Among other things all the get/set-linear/quadratic-factor methods are deprecated. There simply called get/set now.
    • ๐Ÿ—„ All select-methods are deprecated and (will be) replaced by the new methods variables(), constraints() and bounds().


    • ๐Ÿ“ฆ The entire package org.ojalgo.optimisation.system has been deleted. Its functionality is now provided by the various solvers directly.



    • SampleSet now has a method getStandardScore(index) that returns the normalized standard score (z-score) of that particular sample.
    • It is now possible to swap/change the underlying data of a SampleSet using the swap(Access1D<?>) method.


    • ๐Ÿ“ฆ Scalar now extends the interfaces from the new algebra package
    • ๐Ÿ‘Œ Improved numerical accuracy of complex number division


    • ๐Ÿšš All public constructors are removed in favour of factory methods.