Skip to content

Commit

Permalink
Blog post for argmin version 0.10.0 and argmin-math version 0.4.0
Browse files Browse the repository at this point in the history
  • Loading branch information
stefan-k committed Feb 27, 2024
1 parent a9b6de6 commit 1023516
Showing 1 changed file with 138 additions and 0 deletions.
138 changes: 138 additions & 0 deletions media/website/content/blog/version-v0.10.0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
+++
title = "argmin 0.10.0 and argmin-math v0.4.0"
description = ""
date = 2024-02-27T00:00:00+00:00
updated = 2024-02-27T00:00:00+00:00
draft = false
template = "blog/page.html"

[taxonomies]
authors = ["Stefan Kroboth"]

[extra]
+++

<b>argmin</b> 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](https://argmin-rs.org),
in the [book](https://argmin-rs.org/book),
on [Github](https://github.com/argmin-rs/argmin),
on [crates.io](https://crates.io/crates/argmin) and
on [lib.rs](https://lib.rs/crates/argmin).

## 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 reduced its dependencies. With this, 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](https://crates.io/crates/argmin-observer-slog) crate.
* `WriteToFile` was renamed to `ParamWriter` and is now part of the
[argmin-observer-paramwriter](https://crates.io/crates/argmin-observer-paramwriter) crate.
* `FileCheckpoint` is now part of the
[argmin-checkpointing-file](https://crates.io/crates/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`.

##### 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](https://github.com/gmilleramilar) for reporting
and starting the fix).

* A failing line search in `LBFGS` now does not lead to the error propagating to the
`Executor` but instead causes `LBFGS` to terminate with `TerminationReason::SolverExit(string)` where
`string` 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](https://github.com/jonboh)).

* All crates are now in the `crates` directory of the argmin monorepo.

* All examples are now dedicated crates in the `examples` directory.
This makes it easier for users to see which dependencies (and features) an example needs.

* 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](https://github.com/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` and `f64`, thanks to [@sdrap](https://github.com/sdrap)).
* `ArgminRandom::rand_from_range(...)` now also accepts a random number generator. This allows for setting
the seed manually (Thanks to [@jonboh](https://github.com/jonboh)).
* Tests for `ArgminMinMax` were added (Thanks to [@Shreyan11](https://github.com/Shreyan11)).

## Contributing

There currently are [a couple of open issues](https://github.com/argmin-rs/argmin/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, I'd love to hear 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](https://github.com/gmilleramilar),
[@jonboh](https://github.com/jonboh),
[@Tastaturtaste](https://github.com/Tastaturtaste),
[@Shreyan11](https://github.com/Shreyan11),
[@sdrap](https://github.com/sdrap), and
[@stefan-k](https://github.com/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](https://crates.io/crates/gkls-rs), a pure Rust implementation of the GKLS function
generator by [@jonboh](https://github.com/jonboh).

## Discord server

If you're interested you're invited to join the [Discord](https://discord.gg/fYB8AwxxMW)!


<br>
<script async defer src="https://buttons.github.io/buttons.js"></script>
<p align="center">
<a class="github-button" href="https://github.com/argmin-rs/argmin" data-icon="octicon-star" data-size="large" data-show-count="true" aria-label="Star argmin-rs/argmin on GitHub">Star</a>
<a class="github-button" href="https://github.com/argmin-rs/argmin/subscription" data-icon="octicon-eye" data-size="large" data-show-count="true" aria-label="Watch argmin-rs/argmin on GitHub">Watch</a>
<a class="github-button" href="https://github.com/argmin-rs/argmin/fork" data-icon="octicon-repo-forked" data-size="large" data-show-count="true" aria-label="Fork argmin-rs/argmin on GitHub">Fork</a>
<a class="github-button" href="https://github.com/sponsors/stefan-k" data-icon="octicon-heart" data-size="large" aria-label="Sponsor @stefan-k on GitHub">Sponsor</a>
</p>

0 comments on commit 1023516

Please sign in to comment.