argmin 0.10.0 and argmin-math v0.4.0
Posted February 27, 2024 by Stefan Kroboth ‐ 6 min read
argmin is a Rust library which offers a range of numerical optimization methods and is a framework for developing optimization algorithms. Details about the design and features of argmin can be found on the website, in the book, on Github, on crates.io and on lib.rs.
argmin 0.10.0
argmin has seen a few smaller, but partially breaking changes in this release.
Observers and Checkpointing (Breaking)
Observers and checkpointing were moved from argmin into dedicated crates. This greatly reduced the complexity of argmin and the number of its dependencies. Now users can decide which observers and checkpointing they actually need, thus potentially reducing compile times and code size.
Notable changes:
SlogLogger
is now part of the argmin-observer-slog crate.WriteToFile
was renamed toParamWriter
and is now part of the argmin-observer-paramwriter crate.FileCheckpoint
is now part of the argmin-checkpointing-file crate.
Furthermore, Observe::observe_init
, which is called after initialization of the solver, now also has access to the state
, meaning that it can observe the initial state of the optimization run.
Interrupt handling (Breaking)
Interrupt handling now includes SIGINT
, SIGTERM
and SIGHUP
. Consequently, TerminationReason::KeyboardInterrupt
was renamed to TerminationReason::Interrupt
. This is a breaking change for those who match on TerminationReason
.
Optional timeout
Executor
now allows one to terminate a run after a given timeout, which can be set with the timeout
method of Executor
. The check whether the overall runtime exceeds the timeout is performed after every iteration, therefore the actual runtime can be longer than the set timeout. In case of timeout, the run terminates with TerminationReason::Timeout
.
The timeout is set via the timeout
method of Executor
:
let res = Executor::new(operator, solver)
.timeout(std::time::Duration::from_secs(3))
.run()?;
The optional serde1
feature
With moving observers out of the argmin crate, it became easier to reason about the optional serde1
feature, which eventually led to the removal of the SerializeAlias
and DeserializeAlias
traits. Activating serde1
for argmin is now only necessary for checkpointing.
Other changes and fixes
In
GaussNewton
, the residuals were out of sync with the parameter vector (Thanks @gmilleramilar for reporting and starting the fix).A failing line search in
LBFGS
now does not lead to the error propagating to theExecutor
but instead causesLBFGS
to terminate withTerminationReason::SolverExit(string)
wherestring
indicates the reason why the line search failed.The random number generator (RNG) used in
ParticleSwarm
can now be set by users (Thanks to @jonboh).All crates are now in the
crates
directory of the argmin monorepo.All examples are now in dedicated crates in the
examples
directory. This makes it easier for users to see which dependencies (and features) an example requires.argmin-math dependency updated to version 0.4.
argmin-math 0.4.0
Removal of *-serde
features (Breaking)
All features ending with -serde
were removed. Support for serde is now enabled simply be enabling serde support in the backends (ndarray
or nalgebra
). Using *-serde
features will cause a failing build, which can be solved without loss of functionality by removing -serde
from the feature.
Development on Windows
Thanks to @Tastaturtaste development on Windows is finally possible. This was achieved by using MKL in the argmin-math
tests and involved a lot of effort to be able to continue supporting multiple versions of ndarray.
Other changes (Breaking)
ArgminInv
is now also implemented for scalars (f32
andf64
, thanks to @sdrap).ArgminRandom::rand_from_range(...)
now also accepts a random number generator. This allows for setting the seed manually (Thanks to @jonboh).- Tests for
ArgminMinMax
were added (Thanks to @Shreyan11).
Contributing
There currently are a couple of open issues, some of which are good first issues to start getting involved in argmin. I am happy to provide guidance if needed.
Suggestions and feature requests are also welcome. For instance, let me know which observers or checkpointing methods yo would like to see.
Conclusion
This release mostly affected the project structure, which was an important step for further development. By moving observers and checkpointing into dedicated crates, the dependencies of argmin could be reduced and users have more freedom in pulling in only what they need. The changes to ParticleSwarm
and ArgminRandom
allow for reproducible runs by setting an RNG seed. Interrupt handling has become more useful by capturing more interrupts. Finally, development on Windows is possible.
This release included contributions from @gmilleramilar, @jonboh, @Tastaturtaste, @Shreyan11, @sdrap, and @stefan-k. Thanks to the contributors and those who opened and responded to issues and discussions!
A bit offtopic, but I want to use this opportunity to give a shoutout to gkls-rs, a pure Rust implementation of the GKLS function generator by @jonboh.
Discord server
If you're interested you're invited to join the Discord!