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.6.7 (September 9, 2026)
Added
- the new internal function
additional_callbacks(::Type{<:AbstractManoptSolverState})was added to declare the callback hooks instead of manually overwritingprovided_callbacks. (#643) - A
BarzilaiBorweinStepsizeas a standalone stepsize instead of only being available within theNonmonotoneLinesearchStepsize. (#641) - a benchmark suite in
benchmark/, written withBenchmarkTools.jland run withAirspeedVelocity.jl, which on a pull request labeledbenchmarkcompares it againstmaster. It starts with two problems, the Riemannian mean on the sphere, benchmarked withgradient_descentandquasi_Newton, and the Riemannian median on hyperbolic space, benchmarked withcyclic_proximal_point. (#640) - introduce a
StepsizeInitialGuessthat allows to use aStepsizeas initial guess of a line search. (#641) - Runic.jl is now also used to check code formatting in the
.qmdand.mdfiles of the repository (#643) - a keyword
γforinterior_point_Newton, the initial value of its centrality condition. - allocating
get_linear_operator(M, neo, p, B)andget_vector_field(M, neo, p, B)for the coordinates surrogate of the normal equations. (#643) DebugProximalParameterandRecordProximalParametercan now also be used withproximal_point. (#643)
Changed
- the changelog check in CI is skipped on pull requests labeled
no changelog necessary; dependabot adds this label to its pull requests automatically. (#643) - since
has_convergedexists, the status reports on REPL now use this to indicate whether an algorithm has converged. (#643) - the field
X_oldof theMomentumGradientRuleis now calledη_old, since it stores the accumulated momentum direction and not the last gradient. (#643) - the backtracking of the
proximal_gradient_methodno longer constructs aProximalGradientMethodStatein every call, but uses two working points of its step size; the internal_pgm_proximal_step!now takes the sub problem and sub state instead of a whole state. (#643) - the modes of
RecordTimeandDebugTimeare now capitalized consistently, that is:Cumulative,:Iterativeand:Total. (#643) stochastic_gradient_descentwithorder_type=:FixedRandomnow draws a new permutation at the start of every epoch. (#643)- the
TrustRegionsStatefieldsZ,HZandf_proposalwere removed, since they were never read; the Cauchy point is stored inY. (#643) ProximalPointStateis anAbstractManoptSolverState, since it stores no gradient, and it providesget_iterateandset_iterate!. (#643)
Fixed
The following fixes were reported by an AI assisted code review. Each single point was still carefully checked, and committed by hand. Most of them are minor fixes and allowing several areas of Manopt.jl to also work on decorators and other edge cases. Only very few of the fixes are actually bug fixes, e.g. the line search direction in the interior point Newton was slightly wrong. They are still all listed here in detail in case (a) someone else's code breaks or (b) it was not done carefully enough – to then avoid these approaches in the future. <the following list stems from (#643) as some changes above as well. This is the assisted review PR.
adaptive_regularization_with_cubicsnow also runs with a closed-form sub solver; setting the iterate of aClosedFormSubSolverStateis a no-op instead of an error.adaptive_regularization_with_cubicsnow wraps an allocating closed-form sub solver.adaptive_regularization_with_cubicsnow passessub_kwargson to thedecorate_state!of its sub state.adaptive_regularization_with_cubicsno longer evaluates the gradient a second time per iteration, since the state already holds it.get_cost_function(::AdaptiveRegularizationWithCubicsModelObjective, true)now returns the wrapped objective's cost, like its gradient counterpart.AdaptiveWNGradientfixed its reference gradient norm to the initial one, so its adaptive mode now works.AdaptiveWNGradient,BarzilaiBorweinandNonmonotoneLinesearchnow reset their internal state when a solver is initialized, so reusing such a step size object no longer continues from the previous run.AffineCovariantStepsizenow solves the simplified Newton system with the sub problem's own evaluation type, so it works together withsub_state = InplaceEvaluation().alternating_gradient_descentnow uses itsretraction_method.- the step size of
alternating_gradient_descentevaluates only the component gradient of the current block instead of the full gradient. augmented_Lagrangian_method!(M, f, grad_f, p; …)no longer decorates its objective twice, socount=andcache=work for the in-place variant and an already decorated objective is accepted.augmented_Lagrangian_methodandexact_penalty_methodcan now be run with a closed form sub solver.augmented_Lagrangian_methodnow measures the penalty with the multipliers the sub problem was solved with, as its own formula states, instead of with the ones just updated.- the default
stopping_criterionofAugmentedLagrangianMethodStatenow ends inStopWhenStepsizeLess(1.0e-10), matchingaugmented_Lagrangian_method. BarzilaiBorweinStepsizedefaultsmax_stepsizeto1.0on manifolds with infinite injectivity radius.- the first
BarzilaiBorweinstep is now the documented maximal step size instead of a quotient of transport roundoff. NonmonotoneLinesearchnow defaultsbb_max_stepsizeto the same bound asBarzilaiBorweinStepsize, that is0.9of the injectivity radius, instead of the constant1e3that let its first step leave the injectivity radius.cache=(:LRU, [:ProximalMap])now also caches the proximal map without an index, the oneproximal_pointandproximal_gradient_methodcall.- the generalized Cauchy direction no longer exceeds the isotropic maximal step size on a product manifold with a box factor.
ChambollePocknow defaults to the variant matching the operator that was provided; requesting a variant without its operator errors with an explanation.ChambollePocknow accepts and forwards the documentedinverse_retraction_method_dualandvector_transport_method_dualkeywords, which were previously warned about and dropped.ChambollePockStateaccepts integer step sizes, acceleration and relaxation and promotes them.- the
error=keyword ofcheck_gradientandcheck_Hessiannow also applies to theircheck_vectorstep. check_Hessiannow hands its sampling keywords to the gradient check it runs first.cma_es!now leaves its result (the best visited point) in the input point, which before ended at the final mean.cma_esnow uses the fitness-sorted samples in its covariance matrix update, cf. Eq. (47) of arXiv:1604.00772.cma_esnow uses Hansen's1/(21n^2)term in its approximation of the expected norm of a standard normal vector.cma_es(M, mco, p)now also accepts an objective, likecma_es!always did, and both work on manifolds whose points are numbers, for exampleCircle().cma_esnow acceptstol_funandtol_xof different types, so switching one of them off withtol_fun = 0works.conjugate_residualnow uses its initial vectorX— it was ignored, making runs nondeterministic — andconjugate_residual!works in place ofX.ConjugateGradientDescentStatecan now be constructed without specifying a stepsize.- the bundle cap of
convex_bundle_methodis also enforced when the oldest entry is the last serious iterate. convex_bundle_methodnow uses itsretraction_methodfor the candidates of both the domain backtracking and the null step.- the domain backtracking of
convex_bundle_methodno longer contracts the step when the retracted point is as far from the iterate as the tangent vector is long up to rounding. ConvexBundleMethodStateno longer errors when only one ofk_minandk_maxis provided.ConvexBundleMethodStatecan be built and run on its own again.count=[:ProximalMap]now works for aManifoldProximalMapObjectivebuilt from a single proximal map.- the constraint gradient accessors of a
ConstrainedManifoldObjectivenow default to the power representation the constraint function stores, instead of always assumingNestedPowerRepresentation(); an objective built with anArrayPowerRepresentationerrored before. - the cached constraint gradients no longer fail when the objective has only one kind of constraint.
- a range or mask index on cached constraint gradients now returns copies, so mutating the result no longer changes the cache.
- a
Vector{Bool}mask is read as a mask, like aBitVector, when selecting constraints. - the automatic inference of the number of constraints no longer calls in-place constraint functions in allocating form;
augmented_Lagrangian_methodandexact_penalty_methodnow report the missing count instead of failing inside the user's function. CubicBracketingLinesearch,HagerZhangLinesearchandNesterovnow promote mixed numeric types in their keyword arguments.CubicBracketingLinesearchandHagerZhangLinesearchnow also run onFloat32problems, where the step size and the cost have different types.CubicBracketingLinesearchnow uses thegradient=keyword it is given and no longer reads the state fieldXdirectly, so it works for any state implementing the documented interface.- the
:Randomevaluation order ofcyclic_proximal_pointnow reshuffles every cycle; its order values are unified to:Linear,:FixedRandom, and:Random, and validated. - the default prefixes of
DebugEntryChangeandDebugIfEntryname the field instead of printing a literal$f. DebugEveryandRecordEverywith a frequency of one now also show and record the sub solver of the first iteration.DebugStepsizenow respectsat_initforconvex_bundle_method.debug=[:IterativeTime]now really resets the timer each iteration; the factory built it with a:Iterativemode that the functor never matched.- a
(:Stop, prefix)tuple indebug=now lands in the:Stopentry, so it prints the reason at the end instead of the prefix in every iteration. - a debug frequency given at the top level of
debug=now uses the activation offset of the entry it wraps, so a:BeforeIterationentry no longer shows the sub solver run of the previous iteration. decorate_state!now acceptsdebug/recorddictionaries with a concrete action value type, such asDict(:Stop => DebugStoppingCriterion()).DecreasingStepsizein:absolutemode now uses thegradient=keyword it is given, likeConstantStepsize.default_vector_norm(::Euclidean, p, X)returned the norm ofpinstead ofX.difference_of_convex_algorithmnow forwards agradient=, also when the objective carries it.- the closed-form
difference_of_convex_algorithmnow leaves the gradient offin the state. difference_of_convex_proximal_pointnow defaults to the point-type-awaredefault_inverse_retraction_method(M, typeof(p)).difference_of_convex_proximal_pointnow leaves the gradient of the objective in the state'sX.difference_of_convex_proximal_pointnow tells its step size which direction it steps along.- since we introduced the differential in the first order objectives, they were not fully supported in all places. This was now fixed and unified.
DistanceOverGradientsStepsizenow promotes integer keyword arguments to floats instead of erroring on its first call.DomainBackTrackingStepsizeandNullStepBackTrackingStepsizenow start at theirinitial_stepsize.EmbeddedManifoldObjectivenow converts the constraint Hessians to Riemannian ones instead of returning the Euclidean ones.- the allocating
exact_penalty_methodforwarded the equality-constraint count as the inequality count. exact_penalty_methodnow spells its sub-solver callbacks:BeforeSubsolverand:Subsolver, like all other solvers.exact_penalty_methodnow bounds the memory of its default quasi-Newton sub solver by the manifold dimension, asaugmented_Lagrangian_methodalready did.ExactPenaltyMethodStatenow defaults to the same stopping criterion asexact_penalty_method.- the storage wrappers of
FletcherReevesCoefficient,LiuStoreyCoefficientandPolakRibiereCoefficientnow return 0 on their first call, like the other coefficient rules. Frank_Wolfe_methodnow also fires its advertised:BeforeSubsolver,:Subsolverand:Stepsizecallbacks when a closed-form sub solver is used.- the default Frank-Wolfe sub objective is no longer converted from the embedding, since it is Riemannian by construction.
- an allocating Jacobian is wrapped for every
FunctionVectorialType, so aNestedReplacingPowerRepresentationno longer fails at construction. get_constraintsnow works for any constrained objective, not only embedded ones.get_constraintsnow uses the:Constraintscache, which before was allocated but never read nor written.get_count(::StopWhenAny, :Iterations)no longer discards a sub-criterion that stopped at iteration0.get_feasibility_statusworks again; its keyword defaults called the removed plural constraint accessors.- the problem-level
get_grad_inequality_constraint!now has the documentedj = :default and forwards arange. get_gradient_functionof a sub objective now returns the gradient of the sub objective itself, as its adaptive regularization variant already did.- the uncached fallback of
get_gradients!now delegates in place, andget_cost_and_gradient!for aSimpleManifoldCachedObjectivewrites the caller's buffer on a cache hit. get_hess_inequality_constraint!now returns its output buffer instead of the direction when there are no inequality constraints.get_initial_stepsize(amp, ams, vars...; kwargs...)now really accepts the documented keyword and positional arguments, and forwards them through a decorated state.get_iterateis defined forLanczosState, so recording and debugging the sub solver iterate works.get_linear_operator(!) andget_vector_field(!) now pass decorated objectives through, soconjugate_residualacceptscount=andcache=and actually uses the cache.- the
get_objective_*accessors of a sub objective now pass through decorators. gradient_samplingnow also works for number-typed points, likegradient_descent.- the default stopping criterion of
gradient_samplingnow tests the convex hull direction instead of the plain gradient. - the documented
GradientSamplingState(M)constructor works again; itsconvex_hull_coeffsdefault referred to the static parameterR, which is not bound while keyword defaults are evaluated. GradientSamplingStateaccepts real keywords of different types and promotes them.HagerZhangInitialGuessnow uses theretraction_methodof the surroundingHagerZhangLinesearchfor its quadratic step.HybridCoefficientnow updates the storage of each of its inner coefficients at the end of a conjugate gradient step, so a rule that uses the previous search direction, likeDaiYuanCoefficientorHestenesStiefelCoefficient, no longer computes its coefficient from the direction of the step before.initialize_solver!for aProximalBundleMethodStatenow also resetslin_errorsandapprox_errors, so a state can be reused for a secondsolve!.initialize_solver!ofLanczosStateclears the solution, so a reused state does not return the previous one.interior_point_Newtonassembled its line-search gradient with theμ- andλ-components swapped, breaking problems with both constraint types.interior_point_Newton!(M, f, grad_f, Hess_f, p; …)no longer decorates its objective twice, socount=andcache=now work for the in-place variant.interior_point_Newtonnow runs with a closed form sub solver.interior_point_Newton(M, cmo)now has the documented default start point.interior_point_Newtonnow appliesobjective_type=:Euclideanto its KKT sub problem and line search objective as well.interior_point_Newtonnow performs its line search along the Newton direction it steps along.is_Hessian_symmetricnow passes its remaining keyword arguments on toisapprox, as documented.- the Lanczos first-order-progress criterion now uses the correct model gradient norm.
LevenbergMarquardtnow defaults to a coordinate normal-system sub solver on manifolds with box constraints, where the default sub solver errored before.- the allocating
LevenbergMarquardtnow honoursjacobian_tangent_basislike its in-place variant, instead of silently ignoring it. LevenbergMarquardtnow also clamps the damping term todamping_term_maxwhen a step is rejected for being too long.LevenbergMarquardtwithuse_unified_basis=truenow defaults itssub_stateto aCoordinatesNormalSystemState.- the coordinate Levenberg-Marquardt surrogate now converts tangent vectors in its stored
basisinstead of the manifold default. - the basis variants of the Levenberg-Marquardt surrogate now use the cached residuals like their tangent vector counterparts, which also saves two residual evaluations per step.
LevenbergMarquardtevaluates the cost once per iteration and through the decorated objective, socount=andcache=apply to it.LevenbergMarquardtStateno longer needs its Jacobian cache pre-shaped and reports an invaliddamping_reduction_factorwith anArgumentError.linesearch_backtrackno longer errors when called without gradient information; it then backtracks on a plain decrease condition.- the
LineSearches.jlstep size now hands its retraction to the initial guess. mesh_adaptive_direct_searchnow moves the poll base point to the current iterate before the search, so the search is handed a direction tangent at that iterate and the iterates stay on the manifold.mesh_adaptive_direct_searchnow defaults its retraction and vector transport with the point type instead of the number type.mesh_adaptive_direct_searchnow regenerates its random vectorb_lwhenever the mesh size changes, instead of reusing the one of a finer mesh.MeshAdaptiveDirectSearchStatenow defaultsscale_meshand its stopping criterion to the same values asmesh_adaptive_direct_search, that isinjectivity_radius(M)/4andStopWhenPollSizeLess(1e-10).MomentumGradientno longer folds the step size into its stored direction, so solvers no longer apply the step twice; withmomentum=0it now reduces to plain gradient descent.NelderMeadnow honoursreturn_objective=true.- fix a sign in the Nesterov acceleration parameter equation.
nondescent_direction_behavior=:step_towards_negative_gradientnow steps towards the negative gradient.- the allocating
particle_swarmno longer overwrites a user suppliedvelocity. primal_dual_semismooth_Newton!now works in place of its point and is exported.- the in-place
primal_dual_semismooth_Newton!accepts a callable cost, like its allocating variant. primal_dual_semismooth_Newtonnow uses thevector_transport_method=keyword also in its ∂X₁₂ block, and expands that block in the basis at the iteratepinstead of atm.primal_dual_semismooth_Newtonnow builds its ∂X₁₁ basis directions at the iteratep, where the cached basis lives, instead of atm.PrimalDualSemismoothNewtonStatenow defaults its dual variableXtozero_vector(N, n), the tangent space it is actually used in.PrimalDualSemismoothNewtonStateis now constructed as(M, N; kwargs...)likeChambollePockStateprojected_gradient_methodaccepts a number as start point, for example on theCircle.projected_gradient_methodevaluates the gradient once per iteration instead of twice.proximal_bundle_methodandconvex_bundle_methodnow default to the in-place subsolver when used withInplaceEvaluation.proximal_gradient_methodnow supports a function-valuedsub_problemas documented, wrapping it only for an evaluation type and dispatching the closed-form proximal step.proximal_gradient_methodnow accepts a decorated objective, and its:convexbacktracking strategy works together withcount=/cache=.- proximal gradient backtracking now stores the collapsed step size, so a collapse is detected.
proximal_gradient_methodnow rejects an incomplete sub-solver setup up front.proximal_gradient_methodnow also warns with the threshold ofDebugWarnIfStepsizeCollapseditself, not only with the one of its backtracking step size.proximal_gradient_methodnow works with a number as start point, for example onCircle().proximal_gradient_methodnow stores the point its proximal gradient step starts from, soStopWhenGradientMappingNormLessmeasures the documented gradient mapping also under acceleration.- the default proximal parameter of
proximal_pointisk -> 1.0, so it no longer forces integers. ProximalGradientMethodAccelerationnow uses the inverse retraction it is configured with.ProximalGradientMethodBacktrackingStepsizeaccepts numeric keywords of different types and promotes them.ProximalGradientNonsmoothCostnow computes the documented1/(2λ)proximity weight instead ofλ/2.- the box quasi-Newton update now treats a deactivated
initial_scale(as set by apreconditioner) as1, instead of erroring. quasi_Newtonandquasi_Newton!now forwardevaluation=to the objective-based method, so a mutatingpreconditioneris no longer wrapped as allocating.quasi_Newtonnow reports thatcautious_update=trueis not supported on manifolds with an anisotropic maximal step size, instead of failing with aMethodError.- the empty-memory branch of the box quasi-Newton
hessian_valuenow divides byinitial_scalelike its siblings, so the two accessors agree. - the cautious quasi-Newton matrix update now evaluates its bound at the previous iterate, as documented.
quasi_Newtonnow divides the maximal step size by the Riemannian norm on anisotropic manifolds.quasi_Newtonno longer turns the iterate intoNaN, or the box constrained variant into aDimensionMismatch, when a step vanishes because the minimizer was reached before the stopping criterion fires.quasi_Newton!now accepts and forwards the documentednondescent_direction_behaviorkeyword.initial_scale=nothingnow deactivates the initial scaling for the matrix-based quasi-Newton updates.- the cautious quasi-Newton matrix update compares the real part of the inner product against its bound.
- the
:byrdcurvature test in the limited-memory quasi-Newton update now squares the gradient norm. - the limited memory quasi-Newton direction now applies the preconditioner also while its memory is empty or all stored pairs are discarded.
QuasiNewtonStatenow activates the default initial scaling when no preconditioner is given, matchingquasi_Newton.RecordFactoryno longer throws for an entry vector that contains no recording action.RecordIterate(T::DataType)now buildsRecordIterate{T}as documented, instead of a brokenRecordIterate{DataType}.RecordTime(; mode=:Total)now resets its recorded values when the solver state is re-initialized.reflect!now defaults itsinverse_retraction_methodwith the point type, likereflect.ReturnSolverStatenow passesset_parameter!andget_parameteron, so a callback can adjust the stopping criterion withreturn_state=trueas well.set_iterate!for aProximalGradientMethodStateno longer rebinds the state's iterate to the caller's point.set_iterate!ofDouglasRachfordStatenow also updates the reflection point, so it takes effect.set_iterate!of both bundle states now also sets the iterate, so the value survives the nextsolve!.set_parameter!on a decorated objective now passes the update on to the objective it wraps.- for a nicer printing on REPL, a few more
status_summaryfunctions were added stochastic_gradient_descentnow uses itsretraction_methodkeyword.stochastic_gradient_descentwith an absolute step length now normalizes by the stochastic gradient it steps along.StopWhenAllnow accepts a concretely typed vector of criteria, likeStopWhenAnyalready did, instead of silently wrapping it as a single criterion.StopWhenAllLanczosVectorsUsedalso fires when more vectors than configured were used.StopWhenBestCostInGenerationConstantnow resets its counter when a solver starts, so a reused criterion no longer stops in the first iteration.StopWhenChangeLess(ε)without a manifold now stores its iterate generically, instead of allocating storage on aDefaultManifold.StopWhenCriterionWithIterationConditionno longer returns the inner criterion's value from its reset call, which could stop a solver at iteration0without ever consulting the iteration condition.StopWhenIterateNaNnow also checks nested point representations instead of throwing aMethodError.StopWhenKKTResidualLessnow squares the Lagrangian gradient norm, as documented.StopWhenLagrangeMultiplierLessnow provides the documented default tolerance1e-6, so it can be constructed without arguments.StopWhenLagrangeMultiplierLessnow indicates convergence, so a bundle solver that stops on it reports a converged run.StopWhenPopulationConcentratedandStopWhenRelativeResidualLessaccept tolerances of different types and promote them.StopWhenPopulationCostConcentratednow compares the worst against the best fitness of the current generation.StopWhenPopulationDivergesnow tests growth against the start of the run, not an absolute threshold.StopWhenRelativeAPosterioriCostChangeLessOrEqualnow reports the signed relative cost change it actually tests, instead of its absolute value.StopWhenRelativeAPosterioriCostChangeLessOrEqualnow accepts an integerfactr.has_convergedofStopWhenRepeatednow requires the wrapper itself to have indicated to stop.- recording or debugging the step size, or using
StopWhenStepsizeLess, no longer re-runs theBarzilaiBorwein,CubicBracketingLinesearch,HagerZhangLinesearchandNonmonotoneLinesearchstep sizes. subgradient_method(M, sgo)with an objective now defaults its start point torand(M), as documented.subgradient_method!now leaves its result (the best visited point) in the input point, which before ended at the last iterate.- the standalone
truncated_conjugate_gradient_descentnow defaults its trust region radius from the base manifold (not the flat tangent space). truncated_conjugate_gradient_descentnow reports the trust region as exceeded after a boundary step in a negative-curvature direction, sotrust_regionscan enlarge its radius.trust_regionsnow includes the Hessian term of the model decrease in its acceptance ratio also in the default (non-randomized) mode and reuses the Hessian product already computed by its tCG sub solver.trust_regionsnow runs with a closed form sub solver.trust_regionsnow wraps an allocating closed-form sub solver as returning a tangent vector.trust_regionsno longer throws for a non-tCG sub state.trust_regionsnow updates the stored gradient when a step is accepted, so gradient-based stopping criteria as well as debug and record output refer to the current iterate.trust_regionsnow builds its default sub problem from the objective after theobjective_typeconversion, soobjective_type=:Euclideanalso applies to the sub solver.TrustRegionModelObjectiveandAdaptiveRegularizationWithCubicsModelObjectivenow accept anyAbstractManifoldHessianObjective, as documented.WolfePowellBinaryLinesearchnow bisects correctly until the step size fulfills both Wolfe conditions; sometimes a wrong termination check made it stop too early.
Furthermore the following were fixed
- Minor bug fix in the solver
adaptive_regularization_with_cubicsto work on complex manifolds (#644)
0.6.6 (August 25, 2026)
Fixed
augmented_Lagrangian_methodset the penalty parameterρof the sub problem's cost to the constant1/3instead of the currentalms.ρ, while its gradient did receivealms.ρ. (#637)- fix
set_parameter!for:μand:λforAugmentedLagrangianCost. (#637) - fix
AbstractConstrainedFunctionto have two parameters, one for the constrained objective it wraps and one for the type of dual parameters (#639).
0.6.5 (August 22, 2026)
Added
- a new function
requires_updatethat per<:StoppingCriteriontype can indicate, whether a state is present that needs updating in every iteration. - a new shortcut for the
StopWhenCriterionWithIterationConditionthat only evaluates everynth iteration usingstopping_criterion ≞ n(\measeq<TAB> on REPL) as constructor. While in theory also%would have been possible, there was a discussion not to use more-common symbols here, cf. (#509) – and themcould be seen as “modulo”.
Fixed
StopWhenAllandStopWhenAnyevaluated their criteria with short-circuiting, so criteria later in the list were not called in every iteration. Stateful criteria likeStopWhenChangeLessorStopWhenRepeatedwere hence not updated and the reset at initialization did not reach them either. Nowrequires_updateis used to determine which ones need to be called even after one could use a shortcut already – only the ones without state are “short-circuited”. (#632) (#635)
0.6.4 (August 21, 2026)
As an overarching scheme of this release, the single functions in an objective become more independent; their wrapping happens automatically and the objective gets – in turn – a bit more lightweight and has “less cases to handle”.
Added
- DocumenterCodeBlocks.jl plugin added to the documentation
- DocumenterLandingPage.jl enhances the start page with a short teaser for the package now.
- Added a Developer Guide section in the documentation
ManoptKeywordErroris now exported, since it is the error thrown when the:KeywordsErrorModeparameter is set to"error"and a solver receives a keyword it does not accept.
Changed
- All
AbstractManifoldObjectiveshad an evaluation type as first parameter. This has been refactored “down to” the function level, and the functions in the objective are now all expected to be in-place. This allows to combine allocating and in-place variants. The constructors, however, have not changed. (#630) - the file structure has been changed and the
plan/folder has been split with the following motivation- all abstract types and generic implementation and documentation of functions has been moved to
base/. This is also reflected in the documentation, where the newbase/files reflect a developer documentation that additionally includes descriptions of the design choices - concrete types and their implementations have either been moved to the specific solver where they are used / defined, especially for solver states, or now reside in a
commons/folder, when they are of general use for multiple solvers. This structure is also reflected in the documentation.
- all abstract types and generic implementation and documentation of functions has been moved to
- a few internal abstract super types have been renamed for the new scheme that puts more focus on functions, to stay more consistent. The word “functor” is now avoided for structs that actually just represent functions.
AbstractConstrainedFunctorhas been renamed toAbstractConstrainedFunctionAbstractConstrainedSlackFunctorhas been renamed toAbstractConstrainedSlackFunction
get_gradient_functionandget_hessian_functionare unified to always return an allocating variant by default, but can also return an in-place variant now based on anevaluation=keyword. While this is formally breaking, since the default behavior changed, both functions are internal and should also only be used withinManopt.jl.- objectives now also accept a
p=keyword to automatically “wrap” functions that operate on immutable variables – internallyManopt.jlexpects points and tangent vectors to be mutable.
Fixed
has_convergedproduced inconsistent behaviors for more complex stopping criteria. (#631) This has been fixed and the function works now consistently for bothStopWhenAnyandStopWhenAll. (#630)- both in-place subsolver for the convex bundle and proximal bundle method would fail to update the result in case the size of the vector changes. this is now adapted by resizing the (in-place, passed down) result vector accordingly for these subsolvers.
- the cached and the counting objective dispatched the inequality constraint length onto
equality_constraints_length. Cache sizes and counters were therefore wrong whenever a problem has different numbers of equality and inequality constraints. - the default of
start_enforcing_wolfe_conditions_at_bracketing_iterationinHagerZhangLinesearchwas chosen by testinginitial_guess isa ConstantStepsize, which can never hold, sinceConstantInitialGuessis not aStepsize. The default was hence always1instead of the intended2for a constant initial guess. - the
DefaultManifoldfallback of the vector norm used in the Hager-Zhang initial guess computed the norm of the point instead of the norm of the tangent vector. - several
show/status_summarymethods errored or printed wrong content:StopWhenEntryChangeLessandStopWhenRepeatedthrew on somecontext=values,StopWhenLagrangeMultiplierLessprintedBase.namesinstead of its own field, the two Wolfe-Powell line searches printed the retraction method under “vector transport method”, and the objective decorators dropped thecontext=keyword instead of passing it on. - a larger number of docstrings were corrected, where signatures, field names, or supertypes had drifted from the implementation, together with formula and markup errors.
Removed
- The two evaluation types of
ParentEvaluationTypeandAllocatingInplaceEvaluationwere never used anywhere, so removing them is considered nonbreaking. Internally this distinction is now anyways handled on a function level, so that neither of the cases can appear anyways. Neither of these types was ever exported.
0.6.3 (July 20, 2026)
Added
- an extra condition in the backtracking
ProximalGradientMethodBacktrackingStepsizefor theproximal_gradient_method. (#629)
0.6.2 (July 17, 2026)
Added
- a
callbacks =keyword to all solvers (#626)
Changed
Replaced internal
ZeroTangentVectorwithZeroVectorfrom ManifoldsBase.jl. (#625)internally restructure the
plans/code folder and documentation and split it into two parts (#626)- a
base/folder defining interfaces and documenting design ideas of these - a
commons/folder collecting things (some or all) solvers have in common
this should not break other peoples code, but in the documentation, namely “hard link”s to any
plans/element might break – and will all break in the future. When you are linking to these from another documentation, consider usingDocumenterInterlinksinstead.- a
Deprecated
- with actual callbacks available, the
DebugCallbackaction from before is now obsolete and deprecated (#626) - the
callback =is deprecated, since it only servedDebugCallback(#626)
0.6.1 (July 4, 2026)
Added
- the gradient sampling algorithm based on the paper by Hosseini and Uschmajew (#618)
Fixed
- Fix a typo in Riemannian Levenberg–Marquardt documentation. (#621)
- Fixed a coordinate-cache allocation in the
VectorDifferentialFunctionJacobian-action path. (#622)
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 (#617)
- An option to disable the warm start the conjugate residual currently does when used as a subsolver.
nonpositive_curvature_behaviorforQuasiNewtonLimitedMemoryDirectionUpdatethat 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)GeneralizedCauchyDirectionSubsolverfor 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:
StopWhenRelativeAPosterioriCostChangeLessOrEqualandStopWhenProjectedNegativeGradientNormLess. (#554). HagerZhangLinesearchstepsize, a state-of-the-art line search for smooth objectives with cubic interpolation and adaptive Wolfe condition checking. (#554)- Step sizes can now be initialized using
initialize_stepsize!, similar to solvers. (#554) - The
ConjugateResidualStatenow has awarm_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 the
ηparameter has been renamed tocandidate_acceptance_threshold,βtodamping_increase_factorandβ_reductiontodamping_reduction_factor. (#617) - the constructor for the Levenberg-Marquardt state has been unified with the remaining states, to take the
sub_problemandsub_statearguments as second and third positional arguments, respectively. (#617) - the keyword
initial_jacobian_fwithinLevenbergMarquardtis unified in naming to the residual values vector and calledinitial_jacobian_matrices. If you callLevenbergMarquardtwith a single vector component, also a single matrix is allowed. (#617) - an internal field of the solver state of Levenberg-Marquardt was called
jacobian_fthe same as the functions whose result it meant to cache if applicable. To distinguish both, the field is now calledjacobian_matrices. (#617) - the
max_stepsize(M)on theSymmetricPositiveDefinitemanifold was changed from returningInf, 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
showmethods of various state and stopping criteria to properly handle bothreprand multiline printing (#569) - Unified all
showmethods and their human readable analogastatus_summarythroughout the package (#569) - Fixed some text descriptions of a few stopping criteria.
- unify naming of fields,
debugDictionaryof the debug state is now calleddebug_dictionary - the
NesterovRulenow also stores an actualAbstractRetractionMethodinstead of implicitly always using the default one. - Line searches consistently respect
stop_when_stepsize_exceedskeyword argument as a hard limit. (#554) StopWhenChangeLessfalsely 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 packageManifoldAsymptote.jlthis way,Manopt.jlhas less dependencies, especially the color and colorschemes dependencies are dropped linear_subsolver! =was removed from theLevenbergMarquardtsolver interface, since it is imprecise. If you use a closed form solver before, specify it by passing the function tosub_problemand setsub_stateto the corresponding evaluation type
0.5.39 (June 3, 2026)
Fixed
- a small bug where debug statements were printed even though they should not be due to
DebugEveryand unified warnings to print independent ofDebugEvery. (#609)
0.5.38 (May 19, 2026)
Changed
- the
:convexbacktracking strategy forproximal_gradient_methodnow entails a slightly different condition whenever the upper bound on the sectional curvature of the manifold, input via thek_maxkwarg, is positive. This comes with a "tolerance" type parameter,δ, which must be positive.
0.5.37 (May 5, 2026)
Changed
- The default restart rule for
conjugate_gradient_descentis nowRestartOnNonDescentinstead ofNeverRestart, which makes the algorithm more robust to non-convexity and numerical issues. The old default can still be used by explicitly passingrestart_condition=NeverRestart(). (#604) HagerZhangCoefficientRulenow has a safeguard against the denominator being too close to zero (thedenom_thresholdfield). 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
Rules also a variant without being encapsulated in a memory, where the old values have to be passed as keywords. This is now used by theConjugateGradientBealeRestartRulewhen 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
NonlinearLeastSquaresObjectiveis now calledManifoldNonlinearLeastSquaresObjective(#569).- (breaking) discontinue the
JuMPextension. (#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
CoordinateVectorialTypetoCoefficientVectorialTypeto have a consistent naming that anything with respect to a basis is called “coefficients” - moved the old closed-form-in-coordinates subsolver for
LevenbergMarquardthandling to the subsolver; if you implemented your own, pass it tosub_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_residualinLevenbergMarquardtis replaced by more generaldamping_reduction_thresholdandβ_reduction. To recover the behavior ofexpect_zero_residual=true, setdamping_reduction_thresholdto the same value asηandβ_reductiontoβ.
Fixed
- The default line search in
conjugate_gradient_descentis nowArmijoLinesearchStepsizeinstead ofArmijoLinesearch, which makes it work well with custom point types.
0.5.34 (March 3, 2026)
Fixed
Float32support intrust_regionssolver was broken in the previous release, which is now fixed.
0.5.33 (February 18, 2026)
Added
- A clarification on the use of AI in the CONTRIBUTING.md (#573)
_produce_typenow accepts the pointpas an optional third argument, which can be used to produce objects with specific point type for internal buffers. The addition has been utilized inDirectionUpdateRules andStepsizes to improve GPU and custom floating point type compatibility. (#577)- Added another package and paper using
Manopt.jlto the about page (#576).
Fixed
DistanceOverGradientsStepsizenow requires explicitly passing a point as the second argument because it logically depends on receiving the initial point. (#577)
0.5.32 (January 15, 2026)
Fixed
- Fixed failing precompilation related to the release of Glossaries.jl v0.1.1 (#567).
0.5.31 (January 11, 2026)
Changed
Moved the documentation glossaries to using the new Glossaries.jl package.
0.5.30 (December 10, 2025)
Added
- add keyword argument
is_feasible_errortointerior_point_Newtonto control how to handle infeasible starting points (#556) - add keyword argument
at_initto some debug options to control whether they print already at the initialisation and hence before the first iteration (#552)
Fixed
- fixed a few typos in the documentation (#557)
- fixed a bug in
StopWhenRepeatedwhere it stopped already at initialisation if the interior stopping criterion was satisfied (#558)
0.5.29 (November 26, 2025)
Added
- a keyword argument
atolto theConstrainedManifoldObjectiveto set a tolerance for constraint satisfaction. (#545) - a spell checker following crate-ci/typos
Fixed
- Fixed a typo in
DebugFeasibility, where an undefined variable was used. (#544)
Changed
- Removed
atolfromDebugFeasibilityand instead use the one newly addedatolfrom theConstrainedManifoldObjective. (#546) - Move from CompatHelper to dependabot to keep track of dependency updates in Julia packages. (#547)
- moved the
ManoptTestSuitemodule to a sub moduleManopt.TestwithinManopt.jl, so it can be easier reused by others as well (#550) - moved to using a
Project.tomlfor 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 subProject.tomlfiles. (#550)
0.5.28 (November 17, 2025)
Changed
- Unified the interfaces for line search related functions, especially,
linesearch_backtrack(M, F, p, X, s, decrease, contract, η, f0; kwargs...)now haslf0=andgradient=keyword arguments instead of positional ones forXand the lastf0, respectively. It additionally has aDlf0=keyword argument to pass the evaluated differential instead of the gradient, which otherwise defaults to calling the inner product.
- Refactor the nonmonotone linesearch stepsize to have an initial guess that can be set. For now it still afterwards performs the Barzilai-Borwein initial guess,
so a constant initial guess is recommended here. The initial guess may be refactored in the future in a non-breaking release and the meaning of the initial guess in nonmonotone line search may change.
Fixed
- Change the construction of the product manifold in
interior_point_Newtonfrom×toProductManifold, so that the algorithm also work on Product manifoldsM, where it now correctly wrapsMinstead of extending it. - Unified the doc strings for constrained problems.
- Fixed a few typos in the doc strings of matrix update formulae within the quasi-Newton and CG solver.
- Covered one last line in
proximal_gradient_plan
0.5.27 (November 11, 2025)
Added
- In
WolfePowellLinesearchStepsize, two new keyword argumentsstop_increasing_at_step=andstop_decreasing_at_step=were added to limit the number of increase/decrease steps in the initial bracketing phase for splus and sminus, respectively. (resolves (#495)) - refactor
get_messageto only allocate a string when it is asked to deliver one, not every time a message is actually stored. This makes the message system align more withget_reason.
0.5.26 (November 5, 2025)
Added
- a
vectorbundle_newtonsolver to find zeros of equations defined on vector bundles.
Fixed
- fixes a few inconsistencies regarding
get_embedding, which now consistently uses a point type as positional second argument.
Changed
- fixed a few typos in the documentation strings of a few solvers.
- fixed a typo in the documentation of
LevenbergMarquardt. - fixed a bug in an internal tex command to print sums in the documentation.
- fixed the use of
mesh_adaptive_direct_searchon manifolds with irrational injectivity radius. - improved the
CONTRIBUTING.mdto reflect the new code formatter we use, as mentioned in (#527).
0.5.25 (October 9, 2025)
Changed
- Bumped dependencies of all JuliaManifolds ecosystem packages to be consistent with ManifoldsBase.jl 2.0 and Manifolds.jl 0.11
0.5.24 (October 6, 2025)
Added
CubicBracketingLinesearchstep size- fallback in
proximal_gradient_planto use the norm of the inverse retraction if the distance is not available.
0.5.23 (September 14, 2025)
Added
HybridCoefficient(args...)conjugate gradient parameters.- a function
has_converged(sc)function for anyStoppingCriterionto indicate that it both has stopped and the reason is a convergence certificate. Note that compared to the static evaluation ofindicates_convergence(sc), which is independent of the state of the criterion, this is the dynamic variant to be used after a solver has stopped. - a
has_converged(::AbstractManoptSolverState)function to check whether the solver has converged.
Changed
- formerly a stopping criterion could be activated at certain iterations with
sc > 5,sc >= 5,sc == 5,sc <= 5, andsc < 5. This caused too many issues with invalidations, so it has been reduced and moved tosc ⩼ 5,sc ≟ 5,sc ⩻ 5for the cases 1, 3, and 5, respectively, cf. (#509). - Refine the
JuMPextension and add an allocation-free cost and gradient callback for JuMP interface (#498)
0.5.22 (September 09, 2025)
Added
- a
keywords_accepted(f, mode=:warn; kwargs...)function that verifies that all keywords are accepted by a certain function. - an internal function
calls_with_kwargs(f)to indicate which functionsfpasseskwargs...to. - a
KeywordsErrorModepreference parameter to control how keywords that are not used/allowed should be treated. Values are"none","warn"(default), and"error". - Add Distance over Gradients (RDoG) stepsize:
DistanceOverGradientsStepsizeand factoryDistanceOverGradients, a learning‑rate‑free, curvature‑aware stepsize withshow/reprand tests on Euclidean, Sphere, and Hyperbolic manifolds.
Fixed
- the typo in the name
AdaptiveRgularizationWithCubicsModelObjectiveis fixed toAdaptiveRegularizationWithCubicsModelObjective.
0.5.21 (September 5, 2025)
Added
- a system to track keywords, warning when unused ones are passed and a static way to explore possible keywords.
- a
warm_start_factorfield toProximalGradientMethodBacktrackingStepsizeto allow to scale the stepsize in the backtracking procedure. - a
gradient=keyword in severalStepsizes, such that one can avoid to internally avoid computing the gradient again. - used the
gradient=keyword inalternating_gradient_descentconjugate_gradient_descentFrank_Wolfe_methodgradient_descentinterior_point_Newtonquasi_Newtonprojected_gradient_method
- a
restart_conditionfunctor toconjugate_gradient_descent, which allows the algorithm to restart if the search direction is sub-par (#492) - two literature references
Changed
- remodeled the docs for the extensions a bit, added
JuMPto the DocumenterInterlinks. - the internal
VectorizedManifoldwithin that extension is now calledManifoldSet - the internal
ArrayShapewithin that extension is now calledManifoldPointArrayShape - Switch to using Runic.jl as code formatter
Fixed
- Fixed some math rendering in the docs, especially avoid
rawstrings and interpolate math symbols more often. - Fixed allocations in the callbacks of the JuMP interface so that the solver can query the cost and gradient without allocating.
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 initialize 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 then be 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 retract_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 containing 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 anyway.
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
NonmonotoneLinesearchStepsizewhen 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, 2025)
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,StopWhenGradientChangeLessandStopWhenGradientLesscan 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 theManifolds.jlLibrary, likeEuclidean
Changed
- stabilize
max_stepsizeto also work wheninjectivity_radiusdoes 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, useConstantLengthinstead. The length parameter is now a positional argument following the (optional) manifold. Besides thatConstantLengthworks as before, just that omitting the manifold fills the one specified in the solver now.DecreasingStepsizeis no longer exported, useDecreasingLengthinstead.DecreasingLengthworks as before, just that omitting the manifold fills the one specified in the solver now.ArmijoLinesearchis now calledArmijoLinesearchStepsize.ArmijoLinesearchworks as before, just that omitting the manifold fills the one specified in the solver now.WolfePowellLinesearchis now calledWolfePowellLinesearchStepsize, its constantc_1is now unified with Armijo and calledsufficient_decrease,c_2was renamed tosufficient_curvature. Besides that,WolfePowellLinesearchworks as before, just that omitting the manifold fills the one specified in the solver now.WolfePowellBinaryLinesearchis now calledWolfePowellBinaryLinesearchStepsize, its constantc_1is now unified with Armijo and calledsufficient_decrease,c_2was renamed tosufficient_curvature. Besides that,WolfePowellBinaryLinesearchworks as before, just that omitting the manifold fills the one specified in the solver now.NonmonotoneLinesearchis now calledNonmonotoneLinesearchStepsize.NonmonotoneLinesearchworks as before, just that omitting the manifold fills the one specified in the solver now.AdaptiveWNGradientis now calledAdaptiveWNGradientStepsize. Its second positional argument, the gradient function was only evaluated once for thegradient_bounddefault, so it has been replaced by the keywordX=accepting a tangent vector. The last positional argumentphas 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 calledAverageGradientRule.AverageGradientworks as before, but the manifold as its first parameter is no longer necessary andpis 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 calledMomentumGradientRule.MomentumGradientworks as before, but the manifold as its first parameter is no longer necessary andpis now a keyword argument.Nesterovis now calledNesterovRule.Nesterovworks as before, but the manifold as its first parameter is no longer necessary andpis now a keyword argument.ConjugateDescentCoefficientis now calledConjugateDescentCoefficientRule.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 calledDaiYuanCoefficientRule. For theDaiYuanCoefficientthe manifold as its first parameter is no longer necessary and the vector transport has been unified/moved to thevector_transport_method=keyword.FletcherReevesCoefficientis now calledFletcherReevesCoefficientRule.FletcherReevesCoefficientworks as before, but can now use the factory in betweenHagerZhangCoefficientis now calledHagerZhangCoefficientRule. For theHagerZhangCoefficientthe manifold as its first parameter is no longer necessary and the vector transport has been unified/moved to thevector_transport_method=keyword.HestenesStiefelCoefficientis now calledHestenesStiefelCoefficientRule. For theHestenesStiefelCoefficientthe manifold as its first parameter is no longer necessary and the vector transport has been unified/moved to thevector_transport_method=keyword.LiuStoreyCoefficientis now calledLiuStoreyCoefficientRule. For theLiuStoreyCoefficientthe manifold as its first parameter is no longer necessary and the vector transport has been unified/moved to thevector_transport_method=keyword.PolakRibiereCoefficientis now calledPolakRibiereCoefficientRule. For thePolakRibiereCoefficientthe manifold as its first parameter is no longer necessary and the vector transport has been unified/moved to thevector_transport_method=keyword.- the
SteepestDirectionUpdateRuleis now calledSteepestDescentCoefficientRule. TheSteepestDescentCoefficientis equivalent, but creates the new factory temporarily. AbstractGradientGroupProcessoris now calledAbstractGradientGroupDirectionRule- 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 keywordscale_initial_operator=that was inconsistently declared (sometimes boolean, sometimes real) and was unused. It is now calledinitial_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 toget_parametersince it is internal, so internally that is clear; accessing it from outside hence reads anywayManopt.get_parameterset_manopt_parameter!has been renamed toset_parameter!since it is internal, so internally that is clear; accessing it from outside hence readsManopt.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 initialize 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
ClosedFormSubSolverState(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 stateClosedFormSubSolverState. - 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; bothXandpmoved to keyword arguments.AugmentedLagrangianMethodState(M, objective, sub_problem; evaluation=...)was addedAugmentedLagrangianMethodState(M, objective, sub_problem, sub_state; evaluation=...)now hasp=rand(M)as keyword argument instead of being the second positional oneExactPenaltyMethodState(M, sub_problem; evaluation=...)was added andExactPenaltyMethodState(M, sub_problem, sub_state; evaluation=...)now hasp=rand(M)as keyword argument instead of being the second positional oneDifferenceOfConvexState(M, sub_problem; evaluation=...)was added andDifferenceOfConvexState(M, sub_problem, sub_state; evaluation=...)now hasp=rand(M)as keyword argument instead of being the second positional oneDifferenceOfConvexProximalState(M, sub_problem; evaluation=...)was added andDifferenceOfConvexProximalState(M, sub_problem, sub_state; evaluation=...)now hasp=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, useStopWhenChangeLess(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= DebugChangeandRecordChangehad amanifold=and ainvretrkeyword that were replaced by the first positional argumentMandinverse_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 withset_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)that 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 additionaladditional_decrease_conditionandadditional_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 optimization 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 itsKKTVectorFieldJacobianandKKTVectorFieldAdjointJacobian - 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 forHyperrectangle.
Fixed
- a few typos in the documentation
WolfePowellLinesearchno longer usesmax_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 justk_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 forQuasiNewtonState.- 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 onget_last_stepsize(problem, state, step, vars...)was removed. Now the only two left areget_last_stepsize(p, s, vars...)and the one directly checkingget_last_stepsize(::Stepsize)for stored values.- the accidentally exported
set_manopt_parameter!is no longer exported
Changed
get_manopt_parameterandset_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:WhenActiveRecordSubsolverto record the result of a subsolver recording in the main solver, symbol:SubsolverRecordStoppingReasonto 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 are 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 thesectional_curvaturefromManifoldsBase.jl.convex_bundle_methodno longer has the unusedk_minkeyword argument.ManifoldsBase.jlnow is running on Documenter 1.3,Manopt.jldocumentation now uses DocumenterInterLinks to refer to sections and functions fromManifoldsBase.jl
Fixed
- fixes a typo 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 functionsproximal_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 optimization 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 lesslinesearch_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 asManoptExamples.Lemniscateand works on arbitrary manifolds now.artificial_S1_signalis available asManoptExamples.artificial_S1_signalartificial_S1_slope_signalis available asManoptExamples.artificial_S1_slope_signalartificial_S2_composite_bezier_curveis available asManoptExamples.artificial_S2_composite_Bezier_curveartificial_S2_rotation_imageis available asManoptExamples.artificial_S2_rotation_imageartificial_S2_whirl_imageis available asManoptExamples.artificial_S2_whirl_imageartificial_S2_whirl_patchis available asManoptExamples.artificial_S2_whirl_patchartificial_SAR_imageis available asManoptExamples.artificial_SAR_imageartificial_SPD_imageis available asManoptExamples.artificial_SPD_imageartificial_SPD_image2is available asManoptExamples.artificial_SPD_image2adjoint_differential_forward_logsis available asManoptExamples.adjoint_differential_forward_logsadjoint_differential_bezier_controlis available asManoptExamples.adjoint_differential_Bezier_control_pointsBezierSegmentis available asManoptExamples.BezierSegmentcost_acceleration_bezieris available asManoptExamples.acceleration_Beziercost_L2_acceleration_bezieris available asManoptExamples.L2_acceleration_BeziercostIntrICTV12is available asManoptExamples.Intrinsic_infimal_convolution_TV12costL2TVis available asManoptExamples.L2_Total_VariationcostL2TV12is available asManoptExamples.L2_Total_Variation_1_2costL2TV2is available asManoptExamples.L2_second_order_Total_VariationcostTVis available asManoptExamples.Total_VariationcostTV2is available asManoptExamples.second_order_Total_Variationde_casteljauis available asManoptExamples.de_Casteljaudifferential_forward_logsis available asManoptExamples.differential_forward_logsdifferential_bezier_controlis available asManoptExamples.differential_Bezier_control_pointsforward_logsis available asManoptExamples.forward_logsget_bezier_degreeis available asManoptExamples.get_Bezier_degreeget_bezier_degreesis available asManoptExamples.get_Bezier_degreesget_Bezier_inner_pointsis available asManoptExamples.get_Bezier_inner_pointsget_bezier_junction_tangent_vectorsis available asManoptExamples.get_Bezier_junction_tangent_vectorsget_bezier_junctionsis available asManoptExamples.get_Bezier_junctionsget_bezier_pointsis available asManoptExamples.get_Bezier_pointsget_bezier_segmentsis available asManoptExamples.get_Bezier_segmentsgrad_acceleration_bezieris available asManoptExamples.grad_acceleration_Beziergrad_L2_acceleration_bezieris available asManoptExamples.grad_L2_acceleration_Beziergrad_Intrinsic_infimal_convolution_TV12is available asManoptExamples.grad_intrinsic_infimal_convolution_TV12grad_TVis available asManoptExamples.grad_Total_Variationproject_collaborative_TVis available asManoptExamples.project_collaborative_TVprox_parallel_TVis available asManoptExamples.prox_parallel_TVgrad_TV2is available asManoptExamples.grad_second_order_Total_Variationprox_TVis available asManoptExamples.prox_Total_Variationprox_TV2is available asManoptExamples.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.
Changed
- 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)
Changed
- 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)
Changed
- 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)
Changed
- 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 an approximate Hessian.
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
ConstantStepsizeandDecreasingStepsizenow have an additional fieldtype::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 forFixedRankManifoldto 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.
Changed
- 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 Hessianhess_fas well as the start pointp0as 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 09, 2023)
Changed
particle_swarmnow uses much more in-place operations
Fixed
particle_swarmused quite a fewdeepcopy(p)commands still, which were replaced bycopy(M, p)
0.4.13 (April 06, 2023)
Added
get_messageto obtain messages from sub steps of a solverDebugMessagesto 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 theirstate_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 typo 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)
This is the first version with an actual Changelog entry
Added
- Dependency on
ManifoldDiff.jland a start of moving actual derivatives, differentials, and gradients there. AbstractManifoldObjectiveto store the objective within theAbstractManoptProblem- 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
AbstractManoptProblemreplacesProblem- the problem now contains an
AbstractManifoldObjective AbstractManoptSolverStatereplacesOptionsrandom_point(M)is replaced byrand(M)fromManifoldsBase.jlrandom_tangent(M, p)is replaced byrand(M; vector_at=p)
0.3.0 (March 9, 2021)
0.2.0 (April 19, 2020)
0.1.0 (June 3, 2019)
First public release, first registered and announced version of Manopt.jl. This version still also included what is now Manifolds.jl.
The first commit that started Manopt.jl was done on November 25, 2016.