A Manopt problem

A problem describes all static data of an optimisation task and has as a super type

get_objective(o::AbstractManifoldObjective, recursive=true)

return the (one step) undecorated AbstractManifoldObjective of the (possibly) decorated o. As long as your decorated objective stores the objective within o.objective and the dispatch_objective_decorator is set to Val{true}, the internal state are extracted automatically.

By default the objective that is stored within a decorated objective is assumed to be at o.objective. Overwrite _get_objective(o, ::Val{true}, recursive) to change this behaviour for your objectiveo` for both the recursive and the nonrecursive case.

If recursive is set to false, only the most outer decorator is taken away instead of all.

get_objective(mp::AbstractManoptProblem, recursive=false)

return the objective AbstractManifoldObjective stored within an AbstractManoptProblem. If recursive is set to true, it additionally unwraps all decorators of the objective


Return the (original) objective stored the sub obective is build on.


Usually, such a problem is determined by the manifold or domain of the optimisation and the objective with all its properties used within an algorithm, see The Objective. For that one can just use

The exception to these are the primal dual-based solvers (Chambolle-Pock and the PD Semi-smooth Newton), which both need two manifolds as their domains, hence there also exists a

} <: AbstractManoptProblem{MT}

An abstract type for primal-dual-based problems.


From the two ingredients here, you can find more information about