Changelog
All notable Changes to the Julia package Manopt.jl are documented in this file. The file was started with Version 0.4.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.5.20 (July 8, 2025)
Added
- a DebugWarnIfStepsizeCollapsedDebugAction and a related:WarnStepsizesymbol for the debug dictionary. This is to be used in conjunction with theProximalGradientMethodBacktrackingstepsize to warn if the backtracking procedure of theproximal_gradient_methodhit the stepsize length threshold without converging.
Changed
- bumped dependencies.
Fixed
- Fixed a few typos in the docs.
0.5.19 (July 4, 2025)
Added
- a function get_differentialandget_differential_functionfor first order objectives.
- a ParentEvaluationTypeto indicate that a certain objective inherits it evaluation from the parent (wrapping) objective
- a new AllocatingInplaceEvaluationthat is used for the functions that offer both variants simultaneously.
- a differential=keyword for providing a faster way of computinginner(M, p, grad_f(p), X), introduced to the algorithmsconjugate_gradient_descent,gradient_descent,Frank_Wolfe_method,quasi_Newton
Changed
- the ManifoldGradientObjectiveand theManifoldCostGradientObjectiveare now merely a const special cases of theManifoldFirstOrderObjective, since this type might now also represent a differential or other combinations of cost, grad, and differential, where they are computed together.
- the AbstractManifoldGradientObjectiveis renamed toAbstractManifoldFirstOrderObjective, since the
second function might now also represent a differential.
Fixed
- fixes a small bug where calling mesh_adaptive_direct_searchwith a start point in some cases did not initialise the state correctly with that start point.
- The HestenesStiefelCoefficientnow also always returns a real value, similar the other coefficient rules. To the best of our knowledge, this might have been a bug previously.
0.5.18 (June 18, 2025)
Added
- Introduce the algorithm proximal_gradient_methodalong withManifoldProximalGradientObjective,ProximalGradientMethodState, as well as an experimentalProximalGradientMethodAcceleration.
- Add ProximalGradientMethodBacktrackingstepsize.
- Add StopWhenGradientMappingNormLessstopping criterion.
- Introduce a StopWhenRepeatedstopping criterion that stops when the given stopping criterion has indicated to stopntimes (consecutively, ifconsecutive=true).
- Introduce a StopWhenCriterionWithIterationConditionstopping criterion that stops when a given stopping criterion has been satisfied together with a certain iteration condition. This can the generated even with shortcuts likesc > 5
- Introduce a DebugCallbackthat allows to add a callback function to the debug system
- Introduce a callback=keyword to all solvers.
- Added back functions estimate_sectional_curvature,ζ_1,ζ_2,close_pointfromconvex_bundle_method; the function call can stay the same as before since there is a curvature estimation fallback
- Add back some fields and arguments such as p_estimate,ϱ,α, fromConvexBundleMethodState
Changed
- make the GradientDescentStatea bit more tolerant to ignore keywords it does not use.
0.5.17 (June 3, 2025)
Added
- Introduce a StopWhenCostChangeLessstopping criterion that stops when the cost function changes less than a given value.
0.5.16 (May 7, 2025)
Fixed
- fixes a bug in the LineSearches.jlextension, where two (old)retract!s were still
present; they were changed to retact_fused!.
0.5.15 (May 6, 2025)
Fixed
- CMA-ES no longer errors when the covariance matrix has nonpositive eigenvalues due to numerical issues.
0.5.14 (May 5, 2025)
Added
- linear_subsolver!is added as a keyword argument to the Levenberg-Marquardt interface.
Changed
- adapt to using default_basiswhere appropriate.
- the tutorials are now rendered with quartousing theQuartoNotebookRunner.jland are hence purely julia based.
0.5.13 (April 25, 2025)
Added
- Allow setting AbstractManifoldObjectivethrough JuMP
Changed
- Remove dependency on ManoptExamples.jlwhich yielded a circular dependency, though only through extras
- Unify dummy types and several test functions into the ManoptTestSuitesubpackage.
Fixed
- A scaling error that appeared only when calling get_cost_functionon the newScaledManifoldObjective.
- Documentation issues for quasi-Newton solvers.
- fixes a scaling error in quasi newton
- Fixes printing of JuMP models containg Manopt solver.
0.5.12 (April 13, 2025)
Added
- a ScaledManifoldObjectiveto easier build scaled versions of objectives, especially turn maximisation problems into minimisation ones using a scaling of-1.
- Introduce a ManifoldConstrainedSetObjective
- Introduce a projected_gradient_method
0.5.11 (April 8, 2025)
Added
- Configurable subsolver for the linear subproblem in Levenberg-Marquardt. The default subsolver is now also robust to numerical issues that may cause Cholesky decomposition to fail.
0.5.10 (April 4, 2025)
Fixed
- a proper implementation of the preconditioning for quasi_Newton, that can be used instead of or in combination with the initial scaling.
0.5.9 (March 24, 2025)
Added
- add a PreconditionedDirectionvariant to thedirectiongradient processor keyword argument and its correspondingPreconditionedDirectionRule
- make the preconditioner available in quasi Newton.
- in gradient_descentandconjugate_gradient_descentthe rule can be added anyways.
Fixed
- the links in the AD tutorial are fixed and moved to using extref
0.5.8 (February 28, 2025)
Fixed
- fixed a small bug in the NonmonotoneLinesearchStepsizehwn the injectivity radius is an irrational number.
- fixed a small bug in check_gradientwhereepsmight have been called on complex types.
- fixed a bug in several gradient based solvers like quasi_newton, such that they properly work with the combined cost grad objective.
- fixes a few typos in the docs.
0.5.7 (February 20, 20265)
Added
- Adds a mesh adaptive direct search algorithm (MADS), using the LTMADS variant with a lower triangular (LT) random matrix in the mesh generation.
0.5.6 (February 10, 2025)
Changed
- bump dependencies of all JuliaManifolds ecosystem packages to be consistent with ManifoldsBase 1.0
0.5.5 (January 4, 2025)
Added
- the Levenberg-Marquardt algorithm internally uses a VectorGradientFunction, which allows
to use a vector of gradients of a function returning all gradients as well for the algorithm
- The VectorGradientFunctionnow also have aget_jacobianfunction
Changed
- Minimum Julia version is now 1.10 (the LTS which replaced 1.6)
- The vectorial functions had a bug where the original vector function for the mutating case was not always treated as mutating.
Removed
- The geodesic regression example, first because it is not correct, second because it should become part of ManoptExamples.jl once it is correct.
0.5.4 (December 11, 2024)
Added
- An automated detection whether the tutorials are present  if not an also no quarto run is done, an automated --exclude-tutorialsoption is added.
- Support for ManifoldDiff 0.4
- icons upfront external links when they link to another package or Wikipedia.
0.5.3 (October 18, 2024)
Added
- StopWhenChangeLess,- StopWhenGradientChangeLessand- StopWhenGradientLesscan now use the new idea (ManifoldsBase.jl 0.15.18) of different outer norms on manifolds with components like power and product manifolds and all others that support this from the- Manifolds.jlLibrary, like- Euclidean
Changed
- stabilize max_stepsizeto also work wheninjectivity_radiusdos not exist. It however would warn new users, that activate tutorial mode.
- Start a ManoptTestSuitesub package to store dummy types and common test helpers in.
0.5.2 (October 5, 2024)
Added
- three new symbols to easier state to record the :Gradient, the:GradientNorm, and the:Stepsize.
Changed
- fix a few typos in the documentation
- improved the documentation for the initial guess of ArmijoLinesearchStepsize.
0.5.1 (September 4, 2024)
Changed
- slightly improves the test for the ExponentialFamilyProjectiontext on the about page.
Added
- the proximal_pointmethod.
0.5.0 (August 29, 2024)
This breaking update is mainly concerned with improving a unified experience through all solvers and some usability improvements, such that for example the different gradient update rules are easier to specify.
In general this introduces a few factories, that avoid having to pass the manifold to keyword arguments
Added
- A ManifoldDefaultsFactorythat postpones the creation/allocation of manifold-specific fields in for example direction updates, step sizes and stopping criteria. As a rule of thumb, internal structures, like a solver state should store the final type. Any high-level interface, like the functions to start solvers, should accept such a factory in the appropriate places and call the internal_produce_type(factory, M), for example before passing something to the state.
- a documentation_glossary.jlfile containing a glossary of often used variables in fields, arguments, and keywords, to print them in a unified manner. The same for usual sections, text, and math notation that is often used within the doc-strings.
Changed
- Any Stepsizenow has aStepsizestruct used internally as the originalstructs before. The newly exported terms aim to fitstepsize=...in naming and create aManifoldDefaultsFactoryinstead, so that any stepsize can be created without explicitly specifying the manifold.- ConstantStepsizeis no longer exported, use- ConstantLengthinstead. The length parameter is now a positional argument following the (optional) manifold. Besides that- ConstantLengthworks as before,just that omitting the manifold fills the one specified in the solver now.
- DecreasingStepsizeis no longer exported, use- DecreasingLengthinstead.- ConstantLengthworks as before,just that omitting the manifold fills the one specified in the solver now.
- ArmijoLinesearchis now called- ArmijoLinesearchStepsize.- ArmijoLinesearchworks as before,just that omitting the manifold fills the one specified in the solver now.
- WolfePowellLinesearchis now called- WolfePowellLinesearchStepsize, its constant- c_1is now unified with Armijo and called- sufficient_decrease,- c_2was renamed to- sufficient_curvature. Besides that,- WolfePowellLinesearchworks as before, just that omitting the manifold fills the one specified in the solver now.
- WolfePowellBinaryLinesearchis now called- WolfePowellBinaryLinesearchStepsize, its constant- c_1is now unified with Armijo and called- sufficient_decrease,- c_2was renamed to- sufficient_curvature. Besides that,- WolfePowellBinaryLinesearchworks as before, just that omitting the manifold fills the one specified in the solver now.
- NonmonotoneLinesearchis now called- NonmonotoneLinesearchStepsize.- NonmonotoneLinesearchworks as before, just that omitting the manifold fills the one specified in the solver now.
- AdaptiveWNGradientis now called- AdaptiveWNGradientStepsize. Its second positional argument, the gradient function was only evaluated once for the- gradient_bounddefault, so it has been replaced by the keyword- X=accepting a tangent vector. The last positional argument- phas also been moved to a keyword argument. Besides that,- AdaptiveWNGradientworks as before, just that omitting the manifold fills the one specified in the solver now.
 
- Any DirectionUpdateRulenow has theRulein its name, since the original name is used to create theManifoldDefaultsFactoryinstead. The original constructor now no longer requires the manifold as a parameter, that is later done in the factory. TheRuleis, however, also no longer exported.- AverageGradientis now called- AverageGradientRule.- AverageGradientworks as before, but the manifold as its first parameter is no longer necessary and- pis now a keyword argument.
- The IdentityUpdateRulenow accepts a manifold optionally for consistency, and you can useGradient()for short as well as its factory. Hencedirection=Gradient()is now available.
- MomentumGradientis now called- MomentumGradientRule.- MomentumGradientworks as before, but the manifold as its first parameter is no longer necessary and- pis now a keyword argument.
- Nesterovis now called- NesterovRule.- Nesterovworks as before, but the manifold as its first parameter is no longer necessary and- pis now a keyword argument.
- ConjugateDescentCoefficientis now called- ConjugateDescentCoefficientRule.- ConjugateDescentCoefficientworks as before, but can now use the factory in between
- the ConjugateGradientBealeRestartis now calledConjugateGradientBealeRestartRule. For theConjugateGradientBealeRestartthe manifold is now a first parameter, that is not necessary and no longer themanifold=keyword.
- DaiYuanCoefficientis now called- DaiYuanCoefficientRule. For the- DaiYuanCoefficientthe manifold as its first parameter is no longer necessary and the vector transport has been unified/moved to the- vector_transport_method=keyword.
- FletcherReevesCoefficientis now called- FletcherReevesCoefficientRule.- FletcherReevesCoefficientworks as before, but can now use the factory in between
- HagerZhangCoefficientis now called- HagerZhangCoefficientRule. For the- HagerZhangCoefficientthe manifold as its first parameter is no longer necessary and the vector transport has been unified/moved to the- vector_transport_method=keyword.
- HestenesStiefelCoefficientis now called- HestenesStiefelCoefficientRule. For the- HestenesStiefelCoefficientthe manifold as its first parameter is no longer necessary and the vector transport has been unified/moved to the- vector_transport_method=keyword.
- LiuStoreyCoefficientis now called- LiuStoreyCoefficientRule. For the- LiuStoreyCoefficientthe manifold as its first parameter is no longer necessary and the vector transport has been unified/moved to the- vector_transport_method=keyword.
- PolakRibiereCoefficientis now called- PolakRibiereCoefficientRule. For the- PolakRibiereCoefficientthe manifold as its first parameter is no longer necessary and the vector transport has been unified/moved to the- vector_transport_method=keyword.
- the SteepestDirectionUpdateRuleis now calledSteepestDescentCoefficientRule. TheSteepestDescentCoefficientis equivalent, but creates the new factory temporarily.
- AbstractGradientGroupProcessoris now called- AbstractGradientGroupDirectionRule- the StochasticGradientis now calledStochasticGradientRule. TheStochasticGradientis equivalent, but creates the new factory temporarily, so that the manifold is not longer necessary.
 
- the 
- the AlternatingGradientis now calledAlternatingGradientRule.
 AlternatingGradientis equivalent, but creates the new factory temporarily, so that the manifold is not longer necessary.
- quasi_Newtonhad a keyword- scale_initial_operator=that was inconsistently declared (sometimes boolean, sometimes real) and was unused. It is now called- initial_scale=1.0and scales the initial (diagonal, unit) matrix within the approximation of the Hessian additionally to the $\frac{1}{\lVert g_k\rVert}$ scaling with the norm of the oldest gradient for the limited memory variant. For the full matrix variant the initial identity matrix is now scaled with this parameter.
- Unify doc strings and presentation of keyword arguments- general indexing, for example in a vector, uses i
- index for inequality constraints is unified to irunning from1,...,m
- index for equality constraints is unified to jrunning from1,...,n
- iterations are using now k
 
- general indexing, for example in a vector, uses 
- get_manopt_parameterhas been renamed to- get_parametersince it is internal, so internally that is clear; accessing it from outside hence reads anyways- Manopt.get_parameter
- set_manopt_parameter!has been renamed to- set_parameter!since it is internal, so internally that is clear; accessing it from outside hence reads- Manopt.set_parameter!
- changed the stabilize::Bool=keyword inquasi_Newtonto the more flexibleproject!=keyword, this is also more in line with the other solvers. Internally the same is done within theQuasiNewtonLimitedMemoryDirectionUpdate. To adapt,- the previous stabilize=trueis now set with(project!)=embed_project!in general, and if the manifold is represented by points in the embedding, like the sphere,(project!)=project!suffices
- the new default is (project!)=copyto!, so by default no projection/stabilization is performed.
 
- the previous 
- the positional argument p(usually the last or the third to last if sub solvers existed) has been moved to a keyword argumentp=in all State constructors
- in NelderMeadStatethepopulationmoved from positional to keyword argument as well,
- the way to initialise sub solvers in the solver states has been unified In the new variant- the sub_problemis always a positional argument; namely the last one
- if the sub_stateis given as a optional positional argument after the problem, it has to be a manopt solver state
- you can provide the new ClosedFormSolverState(e::AbstractEvaluationType)for the state to indicate that thesub_problemis a closed form solution (function call) and how it has to be called
- if you do not provide the sub_stateas positional, the keywordevaluation=is used to generate the stateClosedFormSolverState.
- when previously pand eventuallyXwhere positional arguments, they are now moved to keyword arguments of the same name for start point and tangent vector.
- in detail- AdaptiveRegularizationState(M, sub_problem [, sub_state]; kwargs...)replaces the (unused) variant to only provide the objective; both- Xand- pmoved to keyword arguments.
- AugmentedLagrangianMethodState(M, objective, sub_problem; evaluation=...)was added
- AugmentedLagrangianMethodState(M, objective, sub_problem, sub_state; evaluation=...)now has- p=rand(M)as keyword argument instead of being the second positional one
- ExactPenaltyMethodState(M, sub_problem; evaluation=...)was added and- ExactPenaltyMethodState(M, sub_problem, sub_state; evaluation=...)now has- p=rand(M)as keyword argument instead of being the second positional one
- DifferenceOfConvexState(M, sub_problem; evaluation=...)was added and- DifferenceOfConvexState(M, sub_problem, sub_state; evaluation=...)now has- p=rand(M)as keyword argument instead of being the second positional one
- DifferenceOfConvexProximalState(M, sub_problem; evaluation=...)was added and- DifferenceOfConvexProximalState(M, sub_problem, sub_state; evaluation=...)now has- p=rand(M)as keyword argument instead of being the second positional one
 
- bumped Manifolds.jlto version 0.10; this mainly means that any algorithm working on a product manifold and requiringArrayPartitionnow has to explicitly dousing RecursiveArrayTools.
 
- the 
Fixed
- the AverageGradientRulefilled its internal vector of gradients wrongly or mixed it up in parallel transport. This is now fixed.
Removed
- the convex_bundle_methodand itsConvexBundleMethodStateno longer accept the keywordsk_size,p_estimatenorϱ, they are superseded by just providingk_max.
- the truncated_conjugate_gradient_descent(M, f, grad_f, hess_f)has the Hessian now a mandatory argument. To use the old variant, provideApproxHessianFiniteDifference(M, copy(M, p), grad_f)tohess_fdirectly.
- all deprecated keyword arguments and a few function signatures were removed:- get_equality_constraints,- get_equality_constraints!,- get_inequality_constraints,- get_inequality_constraints!are removed. Use their singular forms and set the index to- :instead.
- StopWhenChangeLess(ε)is removed, use `- StopWhenChangeLess(M, ε)instead to fill for example the retraction properly used to determine the change
 
- In the WolfePowellLinesearchandWolfeBinaryLinesearchthelinesearch_stopsize=keyword is replaced bystop_when_stepsize_less=
- DebugChangeand- RecordChangehad a- manifold=and a- invretrkeyword that were replaced by the first positional argument- Mand- inverse_retraction_method=, respectively
- in the NonlinearLeastSquaresObjectiveandLevenbergMarquardtthejacB=keyword is now calledjacobian_tangent_basis=
- in particle_swarmthen=keyword is replaced byswarm_size=.
- update_stopping_criterion!has been removed and unified with- set_parameter!. The code adaptions are- to set a parameter of a stopping criterion, just replace update_stopping_criterion!(sc, :Val, v)withset_parameter!(sc, :Val, v)
- to update a stopping criterion in a solver state, replace the old update_stopping_criterion!(state, :Val, v)tat passed down to the stopping criterion by the explicit pass down withset_parameter!(state, :StoppingCriterion, :Val, v)
 
- to set a parameter of a stopping criterion, just replace 
0.4.69 (August 3, 2024)
Changed
- Improved performance of Interior Point Newton Method.
0.4.68 (August 2, 2024)
Added
- an Interior Point Newton Method, the interior_point_newton
- a conjugate_residualAlgorithm to solve a linear system on a tangent space.
- ArmijoLinesearchnow allows for additional- additional_decrease_conditionand- additional_increase_conditionkeywords to add further conditions to accept additional conditions when to accept an decreasing or increase of the stepsize.
- add a DebugFeasibilityto have a debug print about feasibility of points in constrained optimisation employing the newis_feasiblefunction
- add a InteriorPointCentralityConditionthat can be added for step candidates within the line search ofinterior_point_newton
- Add Several new functors- the LagrangianCost,LagrangianGradient,LagrangianHessian, that based on a constrained objective allow to construct the Hessian objective of its Lagrangian
- the CondensedKKTVectorFieldand itsCondensedKKTVectorFieldJacobian, that are being used to solve a linear system withininterior_point_newton
- the KKTVectorFieldas well as itsKKTVectorFieldJacobianand `KKTVectorFieldAdjointJacobian
- the KKTVectorFieldNormSqand itsKKTVectorFieldNormSqGradientused within the Armijo line search ofinterior_point_newton
 
- the 
- New stopping criteria- A StopWhenRelativeResidualLessfor theconjugate_residual
- A StopWhenKKTResidualLessfor theinterior_point_newton
 
- A 
0.4.67 (July 25, 2024)
Added
- max_stepsizemethods for- Hyperrectangle.
Fixed
- a few typos in the documentation
- WolfePowellLinesearchno longer uses- max_stepsizewith invalid point by default.
0.4.66 (June 27, 2024)
Changed
- Remove functions estimate_sectional_curvature,ζ_1,ζ_2,close_pointfromconvex_bundle_method
- Remove some unused fields and arguments such as p_estimate,ϱ,α, fromConvexBundleMethodStatein favor of jutk_max
- Change parameter Rplacement inProximalBundleMethodStateto fifth position
0.4.65 (June 13, 2024)
Changed
- refactor stopping criteria to not store a sc.reasoninternally, but instead only generate the reason (and hence allocate a string) when actually asked for a reason.
0.4.64 (June 4, 2024)
Added
- Remodel the constraints and their gradients into separate VectorGradientFunctionsto reduce code duplication and encapsulate the inner model of these functions and their gradients
- Introduce a ConstrainedManoptProblemto model different ranges for the gradients in the newVectorGradientFunctions beyond the defaultNestedPowerRepresentation
- introduce a VectorHessianFunctionto also model that one can provide the vector of Hessians to constraints
- introduce a more flexible indexing beyond single indexing, to also include arbitrary ranges when accessing vector functions and their gradients and hence also for constraints and their gradients.
Changed
- Remodel ConstrainedManifoldObjectiveto store anAbstractManifoldObjectiveinternally instead of directlyfandgrad_f, allowing also Hessian objectives therein and implementing access to this Hessian
- Fixed a bug that Lanczos produced NaNs when started exactly in a minimizer, since the algorithm initially divides by the gradient norm.
Deprecated
- deprecate get_grad_equality_constraints(M, o, p), useget_grad_equality_constraint(M, o, p, :)from the more flexible indexing instead.
0.4.63 (May 11, 2024)
Added
- :reinitialize_direction_updateoption for quasi-Newton behavior when the direction is not a descent one. It is now the new default for- QuasiNewtonState.
- Quasi-Newton direction update rules are now initialized upon start of the solver with the new internal function initialize_update!.
Fixed
- ALM and EPM no longer keep a part of the quasi-Newton subsolver state between runs.
Changed
- Quasi-Newton solvers: :reinitialize_direction_updateis the new default behavior in case of detection of non-descent direction instead of:step_towards_negative_gradient.:step_towards_negative_gradientis still available when explicitly set using thenondescent_direction_behaviorkeyword argument.
0.4.62 (May 3, 2024)
Changed
- bumped dependency of ManifoldsBase.jl to 0.15.9 and imported their numerical verify functions. This changes the throw_errorkeyword used internally to aerror=with a symbol.
0.4.61 (April 27, 2024)
Added
- Tests use Aqua.jlto spot problems in the code
- introduce a feature-based list of solvers and reduce the details in the alphabetical list
- adds a PolyakStepsize
- added a get_subgradientforAbstractManifoldGradientObjectivessince their gradient is a special case of a subgradient.
Fixed
- get_last_stepsizewas defined in quite different ways that caused ambiguities. That is now internally a bit restructured and should work nicer. Internally this means that the interim dispatch on- get_last_stepsize(problem, state, step, vars...)was removed. Now the only two left are- get_last_stepsize(p, s, vars...)and the one directly checking- get_last_stepsize(::Stepsize)for stored values.
- the accidentally exported set_manopt_parameter!is no longer exported
Changed
- get_manopt_parameterand- set_manopt_parameter!have been revised and better documented, they now use more semantic symbols (with capital letters) instead of direct field access (lower letter symbols). Since these are not exported, this is considered an internal, hence non-breaking change.- semantic symbols are now all nouns in upper case letters
- :activeis changed to- :Activity
 
0.4.60 (April 10, 2024)
Added
- RecordWhenActiveto allow records to be deactivated during runtime, symbol- :WhenActive
- RecordSubsolverto record the result of a subsolver recording in the main solver, symbol- :Subsolver
- RecordStoppingReasonto record the reason a solver stopped
- made the RecordFactorymore flexible and quite similar toDebugFactory, such that it is now also easy to specify recordings at the end of solver runs. This can especially be used to record final states of sub solvers.
Changed
- being a bit more strict with internal tools and made the factories for record non-exported, so this is the same as for debug.
Fixed
- The name :Subsolverto generateDebugWhenActivewas misleading, it is now called:WhenActivereferring to “print debug only when set active, that is by the parent (main) solver”.
- the old version of specifying Symbol => RecordActionfor later access was ambiguous, since
it could also mean to store the action in the dictionary under that symbol. Hence the order for access was switched to RecordAction => Symbol to resolve that ambiguity.
0.4.59 (April 7, 2024)
Added
- A Riemannian variant of the CMA-ES (Covariance Matrix Adaptation Evolutionary Strategy) algorithm, cma_es.
Fixed
- The constructor dispatch for StopWhenAnywithVectorhad incorrect element type assertion which was fixed.
0.4.58 (March 18, 2024)
Added
- more advanced methods to add debug to the beginning of an algorithm, a step, or the end of the algorithm with DebugActionentries at:Start,:BeforeIteration,:Iteration, and:Stop, respectively.
- Introduce a Pair-based format to add elements to these hooks, while all others ar now added to :Iteration (no longer to :All)
- (planned) add an easy possibility to also record the initial stage and not only after the first iteration.
Changed
- Changed the symbol for the :Stepdictionary to be:Iteration, to unify this with the symbols used in recording, and removed the:Allsymbol. On the fine granular scale, all but:Startdebugs are now reset on init. Since these are merely internal entries in the debug dictionary, this is considered non-breaking.
- introduce a StopWhenSwarmVelocityLessstopping criterion forparticle_swarmreplacing the current default of the swarm change, since this is a bit more effective to compute
Fixed
- fixed the outdated documentation of TruncatedConjugateGradientState, that now correctly state thatpis no longer stored, but the algorithm runs onTpM.
- implemented the missing get_iterateforTruncatedConjugateGradientState.
0.4.57 (March 15, 2024)
Changed
- convex_bundle_methoduses the- sectional_curvaturefrom- ManifoldsBase.jl.
- convex_bundle_methodno longer has the unused- k_minkeyword argument.
- ManifoldsBase.jlnow is running on Documenter 1.3,- Manopt.jldocumentation now uses DocumenterInterLinks to refer to sections and functions from- ManifoldsBase.jl
Fixed
- fixes a type that when passing sub_kwargstotrust_regionscaused an error in the decoration of the sub objective.
0.4.56 (March 4, 2024)
Added
- The option :step_towards_negative_gradientfornondescent_direction_behaviorin quasi-Newton solvers does no longer emit a warning by default. This has been moved to amessage, that can be accessed/displayed withDebugMessages
- DebugMessagesnow has a second positional argument, specifying whether all messages, or just the first (- :Once) should be displayed.
0.4.55 (March 3, 2024)
Added
- Option nondescent_direction_behaviorfor quasi-Newton solvers. By default it checks for non-descent direction which may not be handled well by some stepsize selection algorithms.
Fixed
- unified documentation, especially function signatures further.
- fixed a few typos related to math formulae in the doc strings.
0.4.54 (February 28, 2024)
Added
- convex_bundle_methodoptimization algorithm for non-smooth geodesically convex functions
- proximal_bundle_methodoptimization algorithm for non-smooth functions.
- StopWhenSubgradientNormLess,- StopWhenLagrangeMultiplierLess, and stopping criteria.
Fixed
- Doc strings now follow a vale.sh policy. Though this is not fully working, this PR improves a lot of the doc strings concerning wording and spelling.
0.4.53 (February 13, 2024)
Fixed
- fixes two storage action defaults, that accidentally still tried to initialize a :Population(as modified back to:Iterate0.4.49).
- fix a few typos in the documentation and add a reference for the subgradient method.
0.4.52 (February 5, 2024)
Added
- introduce an environment persistent way of setting global values with the set_manopt_parameter!function using Preferences.jl.
- introduce such a value named :Modeto enable a"Tutorial"mode that shall often provide more warnings and information for people getting started with optimisation on manifolds
0.4.51 (January 30, 2024)
Added
- A StopWhenSubgradientNormLessstopping criterion for subgradient-based optimization.
- Allow the message=of theDebugIfEntrydebug action to contain a format element to print the field in the message as well.
0.4.50 (January 26, 2024)
Fixed
- Fix Quasi Newton on complex manifolds.
0.4.49 (January 18, 2024)
Added
- A StopWhenEntryChangeLessto be able to stop on arbitrary small changes of specific fields
- generalises StopWhenGradientNormLessto accept arbitrarynorm=functions
- refactor the default in particle_swarmto no longer “misuse” the iteration change, but actually the new one the:swarmentry
0.4.48 (January 16, 2024)
Fixed
- fixes an imprecision in the interface of get_iteratethat sometimes led to the swarm ofparticle_swarmbeing returned as the iterate.
- refactor particle_swarmin naming and access functions to avoid this also in the future. To access the whole swarm, one now should useget_manopt_parameter(pss, :Population)
0.4.47 (January 6, 2024)
Fixed
- fixed a bug, where the retraction set in check_Hessianwas not passed on to the optional innercheck_gradientcall, which could lead to unwanted side effects, see #342.
0.4.46 (January 1, 2024)
Changed
- An error is thrown when a line search from LineSearches.jlreports search failure.
- Changed default stopping criterion in ALM algorithm to mitigate an issue occurring when step size is very small.
- Default memory length in default ALM subsolver is now capped at manifold dimension.
- Replaced CI testing on Julia 1.8 with testing on Julia 1.10.
Fixed
- A bug in LineSearches.jlextension leading to slower convergence.
- Fixed a bug in L-BFGS related to memory storage, which caused significantly slower convergence.
0.4.45 (December 28, 2023)
Added
- Introduce sub_kwargsandsub_stopping_criterionfortrust_regionsas noticed in #336
Changed
- WolfePowellLineSearch,- ArmijoLineSearchstep sizes now allocate less
- linesearch_backtrack!is now available
- Quasi Newton Updates can work in-place of a direction vector as well.
- Faster safe_indicesin L-BFGS.
0.4.44 (December 12, 2023)
Formally one could consider this version breaking, since a few functions have been moved, that in earlier versions (0.3.x) have been used in example scripts. These examples are now available again within ManoptExamples.jl, and with their “reappearance” the corresponding costs, gradients, differentials, adjoint differentials, and proximal maps have been moved there as well. This is not considered breaking, since the functions were only used in the old, removed examples. Each and every moved function is still documented. They have been partly renamed, and their documentation and testing has been extended.
Changed
- Bumped and added dependencies on all 3 Project.toml files, the main one, the docs/, an the tutorials/ one.
- artificial_S2_lemniscateis available as- ManoptExample.Lemniscateand works on arbitrary manifolds now.
- artificial_S1_signalis available as- ManoptExample.artificial_S1_signal
- artificial_S1_slope_signalis available as- ManoptExamples.artificial_S1_slope_signal
- artificial_S2_composite_bezier_curveis available as- ManoptExamples.artificial_S2_composite_Bezier_curve
- artificial_S2_rotation_imageis available as- ManoptExamples.artificial_S2_rotation_image
- artificial_S2_whirl_imageis available as- ManoptExamples.artificial_S2_whirl_image
- artificial_S2_whirl_patchis available as- ManoptExamples.artificial_S2_whirl_path
- artificial_SAR_imageis available as- ManoptExamples.artificial_SAR_image
- artificial_SPD_imageis available as- ManoptExamples.artificial_SPD_image
- artificial_SPD_image2is available as- ManoptExamples.artificial_SPD_image
- adjoint_differential_forward_logsis available as- ManoptExamples.adjoint_differential_forward_logs
- adjoint:differential_bezier_controlis available as- ManoptExamples.adjoint_differential_Bezier_control_points
- BezierSegmentis available as- ManoptExamples.BeziérSegment
- cost_acceleration_bezieris available as- ManoptExamples.acceleration_Bezier
- cost_L2_acceleration_bezieris available as- ManoptExamples.L2_acceleration_Bezier
- costIntrICTV12is available as- ManoptExamples.Intrinsic_infimal_convolution_TV12
- costL2TVis available as- ManoptExamples.L2_Total_Variation
- costL2TV12is available as- ManoptExamples.L2_Total_Variation_1_2
- costL2TV2is available as- ManoptExamples.L2_second_order_Total_Variation
- costTVis available as- ManoptExamples.Total_Variation
- costTV2is available as- ManoptExamples.second_order_Total_Variation
- de_casteljauis available as- ManoptExamples.de_Casteljau
- differential_forward_logsis available as- ManoptExamples.differential_forward_logs
- differential_bezier_controlis available as- ManoptExamples.differential_Bezier_control_points
- forward_logsis available as- ManoptExamples.forward_logs
- get_bezier_degreeis available as- ManoptExamples.get_Bezier_degree
- get_bezier_degreesis available as- ManoptExamples.get_Bezier_degrees
- get_Bezier_inner_pointsis available as- ManoptExamples.get_Bezier_inner_points
- get_bezier_junction_tangent_vectorsis available as- ManoptExamples.get_Bezier_junction_tangent_vectors
- get_bezier_junctionsis available as- ManoptExamples.get_Bezier_junctions
- get_bezier_pointsis available as- ManoptExamples.get_Bezier_points
- get_bezier_segmentsis available as- ManoptExamples.get_Bezier_segments
- grad_acceleration_bezieris available as- ManoptExamples.grad_acceleration_Bezier
- grad_L2_acceleration_bezieris available as- ManoptExamples.grad_L2_acceleration_Bezier
- grad_Intrinsic_infimal_convolution_TV12is available as- ManoptExamples.Intrinsic_infimal_convolution_TV12
- grad_TVis available as- ManoptExamples.grad_Total_Variation
- costIntrICTV12is available as- ManoptExamples.Intrinsic_infimal_convolution_TV12
- project_collaborative_TVis available as- ManoptExamples.project_collaborative_TV
- prox_parallel_TVis available as- ManoptExamples.prox_parallel_TV
- grad_TV2is available as- ManoptExamples.prox_second_order_Total_Variation
- prox_TVis available as- ManoptExamples.prox_Total_Variation
- prox_TV2is available as- ManopExamples.prox_second_order_Total_Variation
0.4.43 (November 19, 2023)
Added
- vale.sh as a CI to keep track of a consistent documentation
0.4.42 (November 6, 2023)
Added
- add Manopt.JuMP_Optimizerimplementing JuMP's solver interface
0.4.41 (November 2, 2023)
Changed
- trust_regionsis now more flexible and the sub solver (Steihaug-Toint tCG by default) can now be exchanged.
- adaptive_regularization_with_cubicsis now more flexible as well, where it previously was a bit too much tightened to the Lanczos solver as well.
- Unified documentation notation and bumped dependencies to use DocumenterCitations 1.3
0.4.40 (October 24, 2023)
Added
- add a --helpargument todocs/make.jlto document all available command line arguments
- add a --exclude-tutorialsargument todocs/make.jl. This way, when quarto is not available on a computer, the docs can still be build with the tutorials not being added to the menu such that documenter does not expect them to exist.
Changes
- Bump dependencies to ManifoldsBase.jl0.15 andManifolds.jl0.9
- move the ARC CG subsolver to the main package, since TangentSpaceis now already available fromManifoldsBase.
0.4.39 (October 9, 2023)
Changes
- also use the pair of a retraction and the inverse retraction (see last update) to perform the relaxation within the Douglas-Rachford algorithm.
0.4.38 (October 8, 2023)
Changes
- avoid allocations when calling get_jacobian!within the Levenberg-Marquard Algorithm.
Fixed
- Fix a lot of typos in the documentation
0.4.37 (September 28, 2023)
Changes
- add more of the Riemannian Levenberg-Marquard algorithms parameters as keywords, so they can be changed on call
- generalize the internal reflection of Douglas-Rachford, such that is also works with an arbitrary pair of a reflection and an inverse reflection.
0.4.36 ( September 20, 2023)
Fixed
- Fixed a bug that caused non-matrix points and vectors to fail when working with approximate
0.4.35 ( September 14, 2023)
Added
- The access to functions of the objective is now unified and encapsulated in proper get_functions.
0.4.34 ( September 02, 2023)
Added
- an ManifoldEuclideanGradientObjectiveto allow the cost, gradient, and Hessian and other first or second derivative based elements to be Euclidean and converted when needed.
- a keyword objective_type=:Euclideanfor all solvers, that specifies that an Objective shall be created of the new type
0.4.33 (August 24, 2023)
Added
- ConstantStepsizeand- DecreasingStepsizenow have an additional field- type::Symbolto assess whether the step-size should be relatively (to the gradient norm) or absolutely constant.
0.4.32 (August 23, 2023)
Added
- The adaptive regularization with cubics (ARC) solver.
0.4.31 (August 14, 2023)
Added
- A :Subsolverkeyword in thedebug=keyword argument, that activates the newDebugWhenActiveto de/activate subsolver debug from the main solversDebugEvery`.
0.4.30 (August 3, 2023)
Changed
- References in the documentation are now rendered using DocumenterCitations.jl
- Asymptote export now also accepts a size in pixel instead of its default 4cmsize andrendercan be deactivated setting it tonothing.
0.4.29 (July 12, 2023)
Fixed
- fixed a bug, where cyclic_proximal_pointdid not work with decorated objectives.
0.4.28 (June 24, 2023)
Changed
- max_stepsizewas specialized for- FixedRankManifoldto follow Matlab Manopt.
0.4.27 (June 15, 2023)
Added
- The AdaptiveWNGradstepsize is available as a new stepsize functor.
Fixed
- Levenberg-Marquardt now possesses its parameters initial_residual_valuesandinitial_jacobian_falso as keyword arguments, such that their default initialisations can be adapted, if necessary
0.4.26 (June 11, 2023)
Added
- simplify usage of gradient descent as sub solver in the DoC solvers.
- add a get_statefunction
- document indicates_convergence.
0.4.25 (June 5, 2023)
Fixed
- Fixes an allocation bug in the difference of convex algorithm
0.4.24 (June 4, 2023)
Added
- another workflow that deletes old PR renderings from the docs to keep them smaller in overall size.
Changes
- bump dependencies since the extension between Manifolds.jl and ManifoldsDiff.jl has been moved to Manifolds.jl
0.4.23 (June 4, 2023)
Added
- More details on the Count and Cache tutorial
Changed
- loosen constraints slightly
0.4.22 (May 31, 2023)
Added
- A tutorial on how to implement a solver
0.4.21 (May 22, 2023)
Added
- A ManifoldCacheObjectiveas a decorator for objectives to cache results of calls, using LRU Caches as a weak dependency. For now this works with cost and gradient evaluations
- A ManifoldCountObjectiveas a decorator for objectives to enable counting of calls to for example the cost and the gradient
- adds a return_objectivekeyword, that switches the return of a solver to a tuple(o, s), whereois the (possibly decorated) objective, andsis the “classical” solver return (state or point). This way the counted values can be accessed and the cache can be reused.
- change solvers on the mid level (form solver(M, objective, p)) to also accept decorated objectives
Changed
- Switch all Requires weak dependencies to actual weak dependencies starting in Julia 1.9
0.4.20 (May 11, 2023)
Changed
- the default tolerances for the numerical check_functions were loosened a bit, such thatcheck_vectorcan also be changed in its tolerances.
0.4.19 (May 7, 2023)
Added
- the sub solver for trust_regionsis now customizable and can now be exchanged.
Changed
- slightly changed the definitions of the solver states for ALM and EPM to be type stable
0.4.18 (May 4, 2023)
Added
- A function check_Hessian(M, f, grad_f, Hess_f)to numerically verify the (Riemannian) Hessian of a functionf
0.4.17 (April 28, 2023)
Added
- A new interface of the form alg(M, objective, p0)to allow to reuse objectives without creatingAbstractManoptSolverStates and callingsolve!. This especially still allows for any decoration of the objective and/or the state usingdebug=, orrecord=.
Changed
- All solvers now have the initial point pas an optional parameter making it more accessible to first time users,gradient_descent(M, f, grad_f)is equivalent togradient_descent(M, f, grad_f, rand(M))
Fixed
- Unified the framework to work on manifold where points are represented by numbers for several solvers
0.4.16 (April 18, 2023)
Fixed
- the inner products used in truncated_gradient_descentnow also work thoroughly on complex matrix manifolds
0.4.15 (April 13, 2023)
Changed
- trust_regions(M, f, grad_f, hess_f, p)now has the Hessian- hess_fas well as the start point- p0as an optional parameter and approximate it otherwise.
- trust_regions!(M, f, grad_f, hess_f, p)has the Hessian as an optional parameter and approximate it otherwise.
Removed
- support for ManifoldsBase.jl0.13.x, since with the definition ofcopy(M,p::Number), in 0.14.4, that one is used instead of defining it ourselves.
0.4.14 (April 06, 2023)
Changed
- particle_swarmnow uses much more in-place operations
Fixed
- particle_swarmused quite a few- deepcopy(p)commands still, which were replaced by- copy(M, p)
0.4.13 (April 09, 2023)
Added
- get_messageto obtain messages from sub steps of a solver
- DebugMessagesto display the new messages in debug
- safeguards in Armijo line search and L-BFGS against numerical over- and underflow that report in messages
0.4.12 (April 4, 2023)
Added
- Introduce the Difference of Convex Algorithm (DCA) difference_of_convex_algorithm(M, f, g, ∂h, p0)
- Introduce the Difference of Convex Proximal Point Algorithm (DCPPA) difference_of_convex_proximal_point(M, prox_g, grad_h, p0)
- Introduce a StopWhenGradientChangeLessstopping criterion
0.4.11 (March 27, 2023)
Changed
- adapt tolerances in tests to the speed/accuracy optimized distance on the sphere in Manifolds.jl(part II)
0.4.10 (March 26, 2023)
Changed
- adapt tolerances in tests to the speed/accuracy optimized distance on the sphere in Manifolds.jl
0.4.9 (March 3, 2023)
Added
- introduce a wrapper that allows line searches from LineSearches.jl to be used within Manopt.jl, introduce the manoptjl.org/stable/extensions/ page to explain the details.
0.4.8 (February 21, 2023)
Added
- a status_summarythat displays the main parameters within several structures of Manopt, most prominently a solver state
Changed
- Improved storage performance by introducing separate named tuples for points and vectors
- changed the showmethods ofAbstractManoptSolverStates to display their `state_summary
- Move tutorials to be rendered with Quarto into the documentation.
0.4.7 (February 14, 2023)
Changed
- Bump [compat]entry of ManifoldDiff to also include 0.3
0.4.6 (February 3, 2023)
Fixed
- Fixed a few stopping criteria even indicated to stop before the algorithm started.
0.4.5 (January 24, 2023)
Changed
- the new default functions that include pare used where possible
- a first step towards faster storage handling
0.4.4 (January 20, 2023)
Added
- Introduce ConjugateGradientBealeRestartto allow CG restarts using Beale‘s rule
Fixed
- fix a type in HestenesStiefelCoefficient
0.4.3 (January 17, 2023)
Fixed
- the CG coefficient βcan now be complex
- fix a bug in grad_distance
0.4.2 (January 16, 2023)
Changed
- the usage of innerin line search methods, such that they work well with complex manifolds as well
0.4.1 (January 15, 2023)
Fixed
- a max_stepsizeper manifold to avoid leaving the injectivity radius, which it also defaults to
0.4.0 (January 10, 2023)
Added
- Dependency on ManifoldDiff.jland a start of moving actual derivatives, differentials, and gradients there.
- AbstractManifoldObjectiveto store the objective within the- AbstractManoptProblem
- Introduce a CostGradstructure to store a function that computes the cost and gradient within one function.
- started a changelog.mdto thoroughly keep track of changes
Changed
- AbstractManoptProblemreplaces- Problem
- the problem now contains a
- AbstractManoptSolverStatereplaces- Options
- random_point(M)is replaced by- rand(M)from `ManifoldsBase.jl
- random_tangent(M, p)is replaced by- rand(M; vector_at=p)