Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jobs:
julia-version: ["lts", "1"]
os: [ubuntu-latest, macOS-latest, windows-latest]
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
- uses: julia-actions/setup-julia@v3
with:
version: ${{ matrix.julia-version }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/clear_preview.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout gh-pages branch
uses: actions/checkout@v6
uses: actions/checkout@v7
with:
ref: gh-pages
- name: Delete preview and history + push changes
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/documenter.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ jobs:
name: Documentation
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
- uses: quarto-dev/quarto-actions/setup@v2
with:
version: "1.7.29"
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/format.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:
issues: write
pull-requests: write
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
# - uses: julia-actions/setup-julia@v2
# with:
# version: '1'
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/nightly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ jobs:
julia-version: ["pre"]
os: [ubuntu-latest, macOS-latest, windows-latest]
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
- uses: julia-actions/setup-julia@v3
with:
version: ${{ matrix.julia-version }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/spell_check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout Actions Repository
uses: actions/checkout@v6
uses: actions/checkout@v7
- name: Check spelling
uses: crate-ci/typos@v1.47.0
64 changes: 61 additions & 3 deletions Changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,49 @@ The file was started with Version `0.4`.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.5.40] unreleased
## [0.6.0] June 24, 2026

This is a breaking change since the JuMP extension is dropped.
We also unified a few of the internal solver state constructors.

### Added

* A robustified version of the [Riemannian Levenberg Marquardt algorithm](https://manoptjl.org/stable/solvers/LevenbergMarquardt/) (#617)
* An option to disable the warm start the conjugate residual currently does when used as a subsolver.
* `nonpositive_curvature_behavior` for `QuasiNewtonLimitedMemoryDirectionUpdate` that determines how transported (y, s) vector pairs are treated after transport; if their inner product gets too low, it may lead to non-positive-definite Hessians which needs to be avoided. This resolves issue (#549). (#554)
* `GeneralizedCauchyDirectionSubsolver` for handling direction selection in the presence of box (`Hyperrectangle`) constraints in quasi-Newton methods. This allows for L-BFGS-B-style box constraint handling. (#554)
* New stopping criteria: `StopWhenRelativeAPosterioriCostChangeLessOrEqual` and `StopWhenProjectedNegativeGradientNormLess`. (#554).
* `HagerZhangLinesearch` stepsize, a state-of-the-art line search for smooth objectives with cubic interpolation and adaptive Wolfe condition checking. (#554)
* Stopping criteria can now be initialized using `initialize_stepsize!`, similar to solvers. (#554)
* The `ConjugateResidualState` now has a `warm_start=` option when used multiple times, for example in every iteration as a subsolver, to reuse the last state from the previous run.

### Changed

* In the [Riemannian Levenberg Marquardt algorithm](https://manoptjl.org/stable/solvers/LevenbergMarquardt/)t the `η` parameter has been renamed to `candidate_acceptance_threshold`, `β` to `damping_increase_factor` and `β_reduction` to `damping_reduction_factor`. (#617)
* the constructor for the [Levenberg-Marquardt state](https://manoptjl.org/stable/solvers/LevenbergMarquardt/#Manopt.LevenbergMarquardtState) has been unified with the remaining states, to take the `sub_problem` and `sub_state` arguments as second and third positional arguments, respectively. (#617)
* the keyword `initial_jacobian_f` within `LevenbergMarquardt` is unified in naming to the residual values vector and called `initial_jacobian_matrices`. If you call `LevenbergMarquardt` with a single vector component, also a single matrix is allowed. (#617)
* an internal field of the solver state of Levenberg-Marqwuardt was called `jacobian_f` the same as the functions whose result it meant to cache if applicable. To distinguish both, the field is now called `jacobian_matrices`. (#617)
* the `max_stepsize(M)` on the [`SymmetricPositiveDefinite`](https://juliamanifolds.github.io/Manifolds.jl/stable/manifolds/symmetricpositivedefinite/) manifold was changed from returning `Inf`, which is the mathematical maximal stepsize to returning the square root of the maximum (floating point) value to avoid numerical instabilities.
* title of "How to define the cost in the embedding" tutorial (#615)

### Fixed

* Fixed `show` methods of various state and stopping criteria to properly handle both `repr` and multiline printing (#569)
* Unified all `show` methods and their human readable analoga `status_summary` throughout the package (#569)
* Fixed some text descriptions of a few stopping criteria.
* unify naming of fields, `debugDictionary` of the debug state is now called `debug_dictionary`
* the `NesterovRule` now also stores an actual `AbstractRetractionMethod` instead of implicitly always using the default one.
* Line searches consistently respect `stop_when_stepsize_exceeds` keyword argument as a hard limit. (#554)
* `StopWhenChangeLess` falsely claimed to indicate convergence. This is now fixed. (#554)
* miscellaneous broken links in the documentation. (#614)

### Removed

* The extension to JuMP. A replacement as a separate package is planned when the support for variables beyond vectors is more accessible in JuMP
* the plotting functions to `Asymptote`. They can now be found in the separate package [`ManifoldAsymptote.jl`](https://github.com/JuliaManifolds/ManifoldAsymptote.jl)
this way, `Manopt.jl` has less dependencies, especially the color and colorschemes dependencies are dropped
* `linear_subsolver! = ` was removed from the [`LevenbergMarquardt`](https://manoptjl.org/stable/solvers/LevenbergMarquardt/) solver interface, since it is imprecise. If you use a closed form solver before, specify it by passing the function to `sub_problem` and set `sub_state` to the corresponding evaluation type

## [0.5.39] June 3, 2026

### Fixed
Expand Down Expand Up @@ -50,9 +83,34 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Changed

* The default restart rule for `conjugate_gradient_descent` is now `RestartOnNonDescent` instead of `NeverRestart`, which makes the algorithm more robust to non-convexity and numerical issues. The old default can still be used by explicitly passing `restart_condition=NeverRestart()`. (#604)
* `HagerZhangCoefficientRule` now has a safeguard against the denominator being too close to zero (the `denom_threshold` field). By default it is set to 1.0e-10. You can set it to a lower positive value (or even zero) to weaken the safeguard, but it is recommended to keep it to avoid numerical issues. (#604)
* introduce for all `Rule`s also a variant without being encapsulated in a memory, where the old values have to be passed as keywords. This is now used by the `ConjugateGradientBealeRestartRule` when evaluating its inner rule. (#604)

## [0.5.36] April 24, 2026

### Added

* a function `stopped_at(state)` to access the number of iterations it took a solver to stop. (#599)

### Fixed

* a small bug where `get_count(sc::StopWhenAny, Val(:Iteration))` wrongly reported it stopped before the first iteration when it actually did not yet stop. (#599)

## [0.5.35] April 16, 2026

### Changed

* `NonlinearLeastSquaresObjective` is now called `ManifoldNonlinearLeastSquaresObjective` (#569).
* (breaking) discontinue the `JuMP` extension. (#532)
* Improved formatting of the references in the Readme.md (#586)
* Bump compat for RecursiveArrayTools.jl to include version 4
* deactivate CompatHelper Action and solely use dependabot
* (breaking change) renamed `CoordinateVectorialType` to `CoefficientVectorialType` to have a
consistent naming that anything with respect to a basis is called “coefficients”
* moved the old closed-form-in-coordinates subsolver for `LevenbergMarquardt` handling to the subsolver; if you implemented your own, pass it to `sub_problem`,
set the `sub_state` to indicate allocating or in-place evaluation and change the signature as documented; make especially sure to return a tangent vector now and not coordinates.
* (breaking change) `expect_zero_residual` in `LevenbergMarquardt` is replaced by more general `damping_reduction_threshold` and `β_reduction`. To recover the behavior of `expect_zero_residual=true`, set `damping_reduction_threshold` to the same value as `η` and `β_reduction` to `β`.

### Fixed

Expand Down Expand Up @@ -116,7 +174,7 @@ Moved the documentation glossaries to using the new [Glossaries.jl](https://gith
* Removed `atol` from `DebugFeasibility` and instead use the one newly added `atol` from the `ConstrainedManifoldObjective`. (#546)
* Move from CompatHelper to dependabot to keep track of dependency updates in Julia packages. (#547)
* moved the `ManoptTestSuite` module to a sub module `Manopt.Test` within `Manopt.jl`,
so it can be easier reused by others as well (#550)
so it can be easier reused by others as well (#550)
* moved to using a `Project.toml` for tests and an overall `[Workspace]`.
This also allows finally to run single test files without installing all packages manually, but instead just switching to and instantiating the test environment. (#550)
* for compatibility, state also `[source]` entries consistently in the sub `Project.toml` files. (#550)
Expand Down Expand Up @@ -214,7 +272,7 @@ so a constant initial guess is recommended here. The initial guess may be refact
* a `gradient=` keyword in several `Stepsize`s, such that one can avoid to internally avoid computing the gradient again.
* used the ``gradient=` keyword in
* `alternating_gradient_descent`
* `conjugate_gradient`
* `conjugate_gradient_descent`
* `Frank_Wolfe_method`
* `gradient_descent`
* `interior_point_newton`
Expand Down
23 changes: 12 additions & 11 deletions Project.toml
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
name = "Manopt"
uuid = "0fc0a36d-df90-57f3-8f93-d78a9fc72bb5"
version = "0.5.39"
authors = [{family-names = "Bergmann", given-names = "Ronny", alias = "kellertuer", city = "Trondheim", affiliation = "Norwegian University of Science and Technology", country = "NO", email = "manopt@ronnybergmann.net", orcid = "https://orcid.org/0000-0001-8342-7218", website = "https://ronnybergmann.net"}]
version = "0.6.0"

[workspace]
projects = ["test", "docs", "tutorials"]

[deps]
ColorSchemes = "35d6a980-a343-548e-a6ea-1d62b119f2f4"
ColorTypes = "3da002f7-5984-5a60-b8a6-cbb66c0b333f"
Colors = "5ae59095-9a9b-59fe-a467-6f913c188581"
DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8"
Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
Glossaries = "8f48dd54-e453-4cdc-9500-53b96149560b"
Expand All @@ -28,23 +24,18 @@ JuMP = "4076af6c-e467-56ae-b986-b466b2749572"
LRUCache = "8ac3fa9e-de4c-5943-b1dc-09c6b5f20637"
LineSearches = "d3d80556-e9d4-5f37-9878-2ab0fcc64255"
Manifolds = "1cead3c2-87b3-11e9-0ccd-23c62b72b94e"
Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80"
QuadraticModels = "f468eda6-eac5-11e8-05a5-ff9e497bcd19"
RecursiveArrayTools = "731186ca-8d62-57ce-b412-fbd966d074cd"
RipQP = "1e40b3f8-35eb-4cd8-8edd-3e515bb9de08"

[extensions]
ManoptJuMPExt = "JuMP"
ManoptLRUCacheExt = "LRUCache"
ManoptLineSearchesExt = "LineSearches"
ManoptManifoldsExt = "Manifolds"
ManoptRecursiveArrayToolsExt = "RecursiveArrayTools"
ManoptRipQPQuadraticModelsExt = ["RipQP", "QuadraticModels"]

[compat]
ColorSchemes = "3.5.0"
ColorTypes = "0.9.1, 0.10, 0.11, 0.12"
Colors = "0.11.2, 0.12, 0.13"
DataStructures = "0.17, 0.18, 0.19"
Dates = "1.10"
Glossaries = "0.1.1"
Expand All @@ -56,7 +47,6 @@ ManifoldDiff = "0.3.8, 0.4"
Manifolds = "0.11.2"
ManifoldsBase = "2.3.1"
Markdown = "1.10"
Plots = "1.30"
Preferences = "1.4"
Printf = "1.10"
QuadraticModels = "0.9"
Expand All @@ -66,3 +56,14 @@ RipQP = "0.6.4, 0.7"
SparseArrays = "1.10"
Statistics = "1.10"
julia = "1.10"

[[authors]]
affiliation = "Norwegian University of Science and Technology"
alias = "kellertuer"
city = "Trondheim"
country = "NO"
email = "manopt@ronnybergmann.net"
family-names = "Bergmann"
given-names = "Ronny"
orcid = "https://orcid.org/0000-0001-8342-7218"
website = "https://ronnybergmann.net"
2 changes: 2 additions & 0 deletions _typos.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ methodes = "methodes" # french
Serie = "Serie" # french
sur = "sur" # french
cmo = "cmo" # often used abbreviation for constrained manifold objective
BA = "BA" # Maybe rename that shortened version in the tests
nd = "nd" # like in 2nd

[files]
extend-exclude = [
Expand Down
8 changes: 3 additions & 5 deletions docs/Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ DocumenterInterLinks = "d12716ef-a0f6-4df4-a9f1-a5a34e75c656"
FiniteDifferences = "26cc04aa-876d-5657-8c51-4c34ba976000"
Images = "916415d5-f1e6-5110-898d-aaa5f9f070e0"
JLD2 = "033835bb-8acc-5ee8-8aae-3f567f8a3819"
JuMP = "4076af6c-e467-56ae-b986-b466b2749572"
LRUCache = "8ac3fa9e-de4c-5943-b1dc-09c6b5f20637"
LineSearches = "d3d80556-e9d4-5f37-9878-2ab0fcc64255"
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
Expand All @@ -23,8 +22,8 @@ Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
RecursiveArrayTools = "731186ca-8d62-57ce-b412-fbd966d074cd"
RipQP = "1e40b3f8-35eb-4cd8-8edd-3e515bb9de08"

[sources.Manopt]
path = ".."
[sources]
Manopt = {path = ".."}

[compat]
BenchmarkTools = "1.3"
Expand All @@ -37,13 +36,12 @@ DocumenterInterLinks = "0.3, 1"
FiniteDifferences = "0.12"
Images = "0.26"
JLD2 = "0.4, 0.5, 0.6"
JuMP = "1"
LRUCache = "1"
LineSearches = "7"
Literate = "2"
Manifolds = "0.11"
ManifoldsBase = "2"
Manopt = "0.5"
Manopt = "0.6"
Plots = "1"
QuadraticModels = "0.9.6"
RecursiveArrayTools = "2, 3, 4"
Expand Down
19 changes: 15 additions & 4 deletions docs/make.jl
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ tutorials_menu =
"Implement a solver" => "tutorials/ImplementASolver.md",
"Optimize on your own manifold" => "tutorials/ImplementOwnManifold.md",
"Do constrained optimization" => "tutorials/ConstrainedOptimization.md",
"Do optimization with bounds" => "tutorials/BoxDomain.md",
]
# Check whether all tutorials are rendered, issue a warning if not (and quarto if not set)
all_tutorials_exist = true
Expand Down Expand Up @@ -101,7 +102,7 @@ end
# (c) load necessary packages for the docs
using Documenter
using DocumenterCitations, DocumenterInterLinks
using JuMP, LineSearches, LRUCache, Manopt, Manifolds, Plots, RecursiveArrayTools
using LineSearches, LRUCache, Manopt, Manifolds, Plots, RecursiveArrayTools
using RipQP, QuadraticModels

# (d) add contributing.md and changelog.md to the docs – and link to releases and issues
Expand Down Expand Up @@ -162,7 +163,6 @@ makedocs(;
),
modules = [
Manopt,
Base.get_extension(Manopt, :ManoptJuMPExt),
Base.get_extension(Manopt, :ManoptLineSearchesExt),
Base.get_extension(Manopt, :ManoptLRUCacheExt),
Base.get_extension(Manopt, :ManoptManifoldsExt),
Expand All @@ -189,6 +189,7 @@ makedocs(;
"Douglas—Rachford" => "solvers/DouglasRachford.md",
"Exact Penalty Method" => "solvers/exact_penalty_method.md",
"Frank-Wolfe" => "solvers/FrankWolfe.md",
"Generalized Cauchy direction subsolver" => "solvers/generalized_cauchy_direction_subsolver.md",
"Gradient Descent" => "solvers/gradient_descent.md",
"Interior Point Newton" => "solvers/interior_point_Newton.md",
"Levenberg–Marquardt" => "solvers/LevenbergMarquardt.md",
Expand All @@ -209,7 +210,18 @@ makedocs(;
"Plans" => [
"Specify a Solver" => "plans/index.md",
"Problem" => "plans/problem.md",
"Objective" => "plans/objective.md",
"Objective" => [
"Introduction" => "plans/objective.md",
"Cost objectvies" => "plans/objectives/cost.md",
"First-order objectives" => "plans/objectives/first_order.md",
"Second-order objectives" => "plans/objectives/second_order.md",
"Constrained objectives" => "plans/objectives/constrained.md",
"Splitting-based objectives" => "plans/objectives/splitting_based.md",
"Subproblem objectives" => "plans/objectives/sub.md",
"Vectorial objectives" => "plans/objectives/vectorial.md",
"Linear Systems" => "plans/objectives/linear_system.md",
"Decorators for objectives" => "plans/objectives/decorated.md",
],
"Solver State" => "plans/state.md",
"Stepsize" => "plans/stepsize.md",
"Stopping Criteria" => "plans/stopping_criteria.md",
Expand All @@ -218,7 +230,6 @@ makedocs(;
],
"Helpers" => [
"Checks" => "helpers/checks.md",
"Exports" => "helpers/exports.md",
"Test" => "helpers/test.md",
],
"Contributing to Manopt.jl" => "contributing.md",
Expand Down
1 change: 1 addition & 0 deletions docs/src/about.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ Thanks to the following contributors to `Manopt.jl`:
* Mathias Ravn Munkvold contributed most of the implementation of the [Adaptive Regularization with Cubics](solvers/adaptive-regularization-with-cubics.md) solver as well as its [Lanczos](@ref arc-Lanczos) subsolver
* [Sander Engen Oddsen](https://github.com/oddsen) contributed to the implementation of the [LTMADS](solvers/mesh_adaptive_direct_search.md) solver.
* [Jonas Püschel](https://www.uni-augsburg.de/de/fakultaet/mntf/math/prof/numa/team/jonas-pueschel/) contributed [restart rules for the conjugate gradient solver](@ref cg-restart).
* [Patryk Przybysz](https://www.linkedin.com/in/patryk-przybysz-5644aa1a1/) contributed to the [Generalized Cauchy Direction](solvers/generalized_cauchy_direction_subsolver.md).
* [Tom-Christian Riemer](https://www.tu-chemnitz.de/mathematik/wire/mitarbeiter.php) implemented the [trust regions](solvers/trust_regions.md) and [quasi Newton](solvers/quasi_Newton.md) solvers as well as the [truncated conjugate gradient descent](solvers/truncated_conjugate_gradient_descent.md) subsolver.
* [Markus A. Stokkenes](https://www.linkedin.com/in/markus-a-stokkenes-b41bba17b/) contributed most of the implementation of the [Interior Point Newton Method](solvers/interior_point_Newton.md) as well as its default [Conjugate Residual](solvers/conjugate_residual.md) subsolver
* [Laura Weigl](https://num.math.uni-bayreuth.de/en/team/laura-weigl/index.php) implemented the [Vector bundle Newton Method](solvers/vectorbundle_newton.md).
Expand Down
Loading
Loading