Avg Release Cycle
217 days ago
v42.0.0 ChangesFebruary 03, 2017
- ➕ Added a method aggregateRange(...) to Access1D.Aggregatable and created new Access2D.Aggregatable and AccessAnyD.Aggregatable interfaces. Their set of methods now match what's available in the Visitable interfaces.
- 🚚 The interfaces Consumer1D, Consumer2D, ConsumerAnyD, Supplier1D, Supplier2D and SupplierAnyD have been removed - they didn't add anything.
- 🆕 New interfaces Stream1D, Stream2D and StreamAnyD. They're not real streams, they don't (yet) extend BaseStream, but are intended to be stream-like.
- 🚚 New interfaces Mutate1D.Receiver, Mutate2D.Receiver and MutateAnyD.Receiver. They extend Mutate_D and all their nested interfaces respectively and extends Consumer. In part these are replacements for the removed Consumer_D interfaces.
- The Callback_D interfaces as well as the passMatching(...) methods in the Access_D and Mutate_D interfaces are deprecated. They're replaced by a collection of messages named loop_(...) in the Structure_D interfaces.
- 🗄 The method indexOfLargestInDiagonal(long,long) in Access2D.IndexOf is deprecated and replaced by indexOfLargestOnDiagonal(long). The new alternative is restricted to work on the main diagonal only, but the returned index is easier to understand and use.
- PrimitveArray is now abstract but has 2 instantiable subclasses Primitive32Array and Primitive64Array.
- 🆕 New factory methods in Array1D, Array2D and ArrayAnyD that can delegate to any BasicMatrix factory that you supply.
- NumberList now implements Access1D.Visitable.
- 🆕 New package org.ojalgo.array.blas: The aim is to refactor the code base so that methods matching BLAS functionality should be moved to this new package.
- 🚚 The Unsafe/off-heap array implementations have been moved to the new ojAlgo-unsafe project (part of ojAlgo-extensions).
- The POWERS_OF_2 in PrimitiveMath were incorrectly calculated - it's fixed now. At the same time the type was changed from int to long and the number of entries extended.
- 🆕 New constructor in SimplePortfolio taking an array of double as input (representing individual asset weights).
- The AggregatorSet class has a new nethod get(...) that will return the correct AggregatorFunction for a specified Aggregator instance.
- BigAggregator, ComplexAggregator, PrimitiveAggregator, QuaternionAggregator and RationalAggregator all now extend AggregatorSet.
- 🗄 All previously existing variations of getXXFunction(...) in Aggregator has been deprecated and are replaced by by 1 new variant.
- ➕ Added a (NumberContext) enforce method to the FunctionSet class. It returns a UnaryFunction that enforces a NumberContext on the the function's input argument.
- ➕ Added andThen(...) and compose(...) methods, where applicable, to all BasicFunction subinterfaces.
- Both BasicMatrix and MatrixStore now extends the new Access2D.Aggregatable rather than Access1D.Aggregatable.
- 👉 Tweaking of several of the matrix decomposition (and task) implementations to improve numerical stability.
- 🆕 New classes RowsSupplier and ColumnsSupplier that can be instantiated from the PhysicalStore.Factory:s (experimental design)
- 🗄 All previously existing variations of getXXFunction(...) in NumberContext has been deprecated and are replaced by by 1 new variant that takes a FunctionSet as input.
- 🆕 New class NativeMemory used as single point to allocate, read or write native memory.
v41.0.0 ChangesNovember 13, 2016
- 🚚 Moved the modifyMatching(...) methods from Mutate1D.Modifiable to a new interface Mutate1D.BiModifiable and only those classes that absolutely need to (to preserve existing functionality) implements that new interface. (Potentially api-breaking, but most likely not.) There are also corresponding interfaces Mutate2D.BiModifiable and MutateAnyD.BiModifiable
- 🗄 The fillMatching(..) methods in Mutate1D.Fillable are deprecated.
- 🆕 New (functional) interfaces Callback1D, Callback2D & CallbackAnyD. The Access?D and Mutate?D interfaces have also gotten new default methods named passMathing(...) that makes use of those new interfaces.
- There's a new method elements() in Access1D that returns an Iterable of ElementView1D - it allows to iterate over the instance's element "positions" without actually extracting the elements (unless you explicitly do so). There a corresponding method in Access2D. That interface also has methods rows() and columns() that does similar things but with rows and columns.
- ElementView1D now implements ListIterator rather than Iterator.
- 🆕 New interface IndexMapper translates back and forth between an arbitrary "key" and a long index. Among other things used to implement the new (time) series classes.
- 📦 The previously package private class ArrayFactory is now public, and the static factory instances of BigArray, ComplexArray, PrimitiveArray, QuaternionArray and RationalArray are now also public.
- 📜 There's been additions to the ArrayFactory regarding how to create sparse or segmented arrays.
- 🆕 New class NumberList - essentially an "ArrayList" backed by ojAlgo's BasicArray hierarchy of classes.
- 🆕 New class LongToNumberMap - a long -> Number map - backed by ojAlgo's array classes.
- 🚚 The previously deprecated methods searchAscending() and searchDescending() are now actually deleted, but the corresponding sortAscending() and sortDescending() got new implementation and had their deprecations removed instead.
- There is now a new class EfficientFrontier to complement MarkowitzModel. If you don't want/need to be able set constraints and/or a target return/variance (like you can with the MarkowitzModel) then this new class is more efficient. Particular in regards to reusing partial results when calculating several points along the efficient frontier.
- The MarkowitzModel class now has a method optimiser() that return an instance of Optimiser that enable turning validation and debugging of the underlying optimization algorithm on/off.
- It is now possible to normalize any FinancePortfolio to the precision and scale (NumberContext) of your choice.
- The optional "cleaning" functionality of FinanceUtils' toCorrelations(...) and toVolatilities(...) methods have been improved.
- 📜 The DataSource class now implements the new org.ojalgo.netio.BasicParser interface.
- ➕ Additions to FunctionSet: atan2, cbrt, ceil, floor & rint.
- Made sure ojAlgo consistently (internally) uses PrimitiveFunction rather than java.lang.Math directly
- 👌 Improved the BigDecimal implementations of sqrt, root and the new cbrt functions.
- 📜 The resolve methods in IterativeSolverTask.SparseDelegate and MutableSolver, respectively, now return double rather than void or MatrixStore - they return the magnitude of the solution error.
- 🗄 The method factory() in ElementsSupplier is renamed (deprecated) physical(). In MatrixStore you now have methods logical() and physical() returning MatrixStore.LogicalBuilder and PhysicalStore.Factory respectively.
- 📦 The nested class org.ojalgo.matrix.decomposition.DecompositionStore.HouseholderReference has been moved to the org.ojalgo.matrix.transformation package. Further it is now an interface rather than a class.
- The method copyToBuilder() in BasicMatrix has been renamed copy()
- It is now possible to extract complex valued eigenvectors (actually having ComplexNumber elements) using the getEigenvetors() and getEigenvetor(int) methods.
- The eigenvalue array returned by getEigenvalues() is no longer required to always be sorted. If it is sorted or not is indicated by the isSorted() method.
- The solve(...) methods in MatrixDecomposition.Solver are renamed getSolution(...)
- 🚚 The 2 classes BufferedInputStreamReader and BufferedOutputStreamWriter have been removed - they didn't do anything other/more than the usual streams and reader/writer classes.
- The getStreamReader() method of ResourceLocator now simply return a Reader rather than a BufferedReader.
- The model parameter rescaling feature of ExpressionsBasedModel has been modified. Previously it didn't work very well with extremely large or small model parameters. Now with very large or small model parameters the rescaling functionality is turned off.
- 👌 Improved ExpressionsBasedModel's presolve functionality to identify and handle some cases of unbounded and/or uncorrelated variables.
- ➕ Added quartiles to SampleSet: getQuartile1(), getQuartile2(), getQuartile3() and getInterquartileRange()
- 🆕 New builder instances in the BasicSeries interface. If you use them they will return implementations, new to v41, backed by array classes from the org.ojalgo.array package. It is now possible to use just about any date/time related class as a time series key.
- 🗄 The methods getDataSeries() and getPrimitiveValues() are deprecated, both replaced by the new method getPrimitiveSeries(). Further the modifyAll(UnaryFunction) method is deprecated. You should do modifications on the series returned by getPrimitiveSeries().
v40.0.0 ChangesJune 20, 2016
- 🏗 The Access1D.Builder, Access2D.Builder and AccessAnyD.Builder interfaces have been removed. The API of the BasicMatrix builder have changed slightly as a consequence of this.
- 🚚 Many of the nested interfaces within Access1D, Access2D and AccessAnyD have been moved/renamed to be normal top level interfaces (declared in their own files). Typically this just means that import, implements and extends declarations within ojAlgo have changed.
- 🆕 New nested interface Access1D.Aggregatable defining a new method N aggregateAll(Aggregator)
- 🆕 New methods in Access1D - dot(Access1D<?>) and daxpy(double,Mutate1D) that bring basic (primitive double) linear algebra functionality to any/all Access1D implementation. Those are very useful operations to "always" have available.
- 📜 It is now possible to specify the initial capacity (the number of nonzeros) of a SparseArray, and a SparseArray can now be emptied / reset to all zeros.
- 🛠 Fixed a bug that erroneously set null constraints (unbounded) to zero with the MarkowitzModel and PortfolioMixer classes. This was mostly a problem when defining custom constraints on MarkowitzModel instances with lower limits only (the upper limit was erroneously set to 0.0).
- 🛠 Fixed a bug in MarkowitzModel: Portfolios with shorting allowed and a target return/variance were not always calculated correctly.
- 🗄 Deprecated org.ojalgo.function.aggregator.AggregationResults as well as the snapshot() method of org.ojalgo.function.aggregator.AggregationFunction.
- 🏗 There is a new interface BasicMatrix.Builder that specifies the API of the BasicMatrix builder. Previously this was specified by Access2D.Builder that is now removed. The API changed in that the various builder methods no longer return the builder instance, but void.
- 👌 Improved performance with sparse and/or structured matrices - refactored existing multiplication code to actually make use of the firstInRow/Column and limitOfRow/Column methods. (Also fixed a couple of bugs related to implementations of those methods.)
- 🆕 New package org.ojalgo.matrix.task.iterative containing interative equation system solvers such as JacobiSolver, GaussSeidelSolver and ConjugateGradientSolver.
- 🏗 Two new methods in MatrixStore.Builder - limits(int,int) and offsets(int,int) - that lets you treat a subregion of a matrix as a (full) matrix.
- 🔄 Changes to BasicMatrix:
- The method add(int,int,Number) has been removed. BasicMatrix instances are immutable! Use copyToBuilder() instead.
- It now extends as much as possible from the org.ojalgo.access and org.ojalgo.algebra packages. Similar methods previously defined in BasicMatrix are now replaced by whatever is in the superinterfaces resulting in some (api-breaking) signature changes.
- As much as possible has been moved up from BasicMatrix to the various interfaces in org.ojalgo.access
- Lots of things have been deprecated to enabled changes (possible) changes in the next version.
- 🆕 New matrix decomposition factory instances. There is now one factory interface for each of the matrix decompositions as well as standard instantiations for "BIG", "COMPLEX" and "PRIMITIVE".
- The method MatrixStore#multiplyLeft(Access1D) has been renamed premultiply(Access1D), and the signature of MatrixStore#multiply(Access1D) has changed to multiply(MatrixStore). That's because it is now declared in org.ojalgo.algebra.Opreation.Multiplication.
- 🏗 The class MatrixStore.Builder has been renamed MatrixStore.LogicalBuilder and the method in MatrixStore that returned an instance of it has been renamed from MatrixStore.builder() to MatrixStore.logical(). Further the MatrixStore.LogicalBuilder#build() method has been deprecated in favor of get().
- 🛠 Fixed accuracy problem with the SVD and pseudoinverse for larger matrices, as well as a problem that could cause indefinite iterations with the SVD decomposition.
- The multiply-method where you supply a target (product) matrix has changed signature. It now returns void, and the target is an ElementsConsumer rather than a PhysicalStore.
- 📜 SparseStore now implements ElementsConsumer.
- The signature of the MatrixTask factory methods have changed. You now have to specify boolean flags for symmetric/hermitian and positive definite independantly.
- 👌 Improved ConvexSolver. It now has much better performance with larger models. Current tests indicate a 50x speed improvement on a model of roughly 4k variables. With smaller models, < 100 variables, there's no significant difference between the old and new versions. These are internal changes only, but "significant". All unit test pass, but you should expect some changed behaviour.
- Some internal modifications to LinearSolver.
- 🛠 Fixed bugs in CoordinationSet related to pruning and resampling when the series did not have specified names.
- 📇 Renamed Colour to ColourData
- 🛠 Fixed a bug in CalendarDate#toSqlDate(). The Date was 70 years off. (The bug was introduced in v39.)
- CalendarDate now implements Temporal
- CalendarDateUnit now implements TemporalUnit
- CalendarDateDuration now implements TemporalAmount
v39.0.0 ChangesNovember 28, 2015
🚚 >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.
The first version to require Java 8!
The last version to not require Java 8! (Targets Java 7) No real new features compared to v36.
📦 v37.1 contains a backport of the optimisation packages from the upcoming v38 (as it was 2015-01-31). It has a number of important improvements. Apart from that it is identical to v37, and still targets Java 7.