Problems

A problem usually only carries a manifold and an objective. For this case one can use the DefaultManoptProblem. There are, however, cases where more properties belong to a problem. The following ones are available in Manopt.jl:

Manopt.ConstrainedManoptProblemType
ConstrainedManoptProblem{
    TM <: AbstractManifold,
    O <: AbstractManifoldObjective,
    HR<:Union{AbstractPowerRepresentation,Nothing},
    GR<:Union{AbstractPowerRepresentation,Nothing},
    HHR<:Union{AbstractPowerRepresentation,Nothing},
    GHR<:Union{AbstractPowerRepresentation,Nothing},
} <: AbstractManoptProblem{TM}

A constrained problem might feature different ranges for the (vectors of) gradients of the equality and inequality constraints.

The ranges are required in a few places to allocate memory and access elements correctly, they work as follows:

Assume the objective is

\[\begin{aligned} \operatorname*{arg\,min}_{p ∈ \mathcal{M}} & f(p)\\ \text{subject to } & g_i(p) ≤ 0 \quad \text{ for all } i=1,…,m,\\ \quad & h_j(p)=0 \quad \text{ for all } j=1,…,n. \end{aligned}\]

then the gradients can (classically) be considered as vectors of the component gradients, for example $\bigl(\operatorname{grad} g_1(p), \operatorname{grad} g_2(p), …, \operatorname{grad} g_m(p) \bigr)$.

In another interpretation, this can be considered a point in the tangent space at $P = (p,…,p) ∈ \mathcal{M}^m$, so in the tangent space to the PowerManifold $\mathcal{M}^m$. In the case of a NestedPowerRepresentation this agrees with the interpretation from before, but on power manifolds, more efficient representations exist.

To then access the elements, the range has to be specified. That is what this problem is for.

Constructor

ConstrainedManoptProblem(    M::AbstractManifold,    co::ConstrainedManifoldObjective;    range=NestedPowerRepresentation(),    gradient_equality_range=range,    gradient_inequality_range=range,    hessian_equality_range=range,    hessian_inequality_range=range,)

Creates a constrained Manopt problem, where range sets the AbstractPowerRepresentation for all four ranges at once; each of gradient_equality_range, gradient_inequality_range, hessian_equality_range and hessian_inequality_range can be given individually to override it.

Fields

  • manifold: the manifold the problem is defined on
  • objective: the ConstrainedManifoldObjective
  • grad_equality_range, grad_inequality_range: the ranges of the constraint gradients
  • hess_equality_range, hess_inequality_range: the ranges of the constraint Hessians
source
Manopt.TwoManifoldProblemType
TwoManifoldProblem{
    MT<:AbstractManifold,NT<:AbstractManifold,S<:AbstractManifoldObjective
} <: AbstractManoptProblem{MT}

A problem that requires two manifolds, for example the primal-dual-based problems.

Fields

  • first_manifold: the first manifold $\mathcal{M}$
  • second_manifold: the second manifold $\mathcal{N}$
  • objective: the objective defined on these two manifolds
source
Manopt.dual_residualMethod
dual_residual(tmp::TwoManifoldProblem, apds::AbstractPrimalDualSolverState, p_old, X_old, n_old)

Compute the dual residual at current iterate $k$ given the necessary values $p_{k-1}, X_{k-1}$, and $n_{k-1}$ from the previous iterate. The formula is slightly different depending on the apds.variant used:

For the :linearized it reads

\[\lVert \frac{1}{τ}\bigl( V_{n_{k}← n_{k-1}}(X_{k-1}) - X_k \bigr ) - DΛ(m_k)\bigl[ V_{m_k← x_k}\operatorname{retr}^{-1}_{x_{k}}(x_{k-1})\bigr] \rVert\]

and for the :exact variant

\[\lVert \frac{1}{τ} V_{n_{k}← n_{k-1}}(X_{k-1}) - \operatorname{retr}^{-1}_{n_{k}}\bigl( Λ(\operatorname{retr}_{m_{k}}(V_{m_k← x_k}\operatorname{retr}^{-1}_{x_{k}}x_{k-1}))\bigr) \rVert\]

where in both cases $V_{⋅←⋅}$ is the vector transport used in the ChambollePockState.

source
Manopt.primal_residualMethod
primal_residual(tmp::TwoManifoldProblem, apds::AbstractPrimalDualSolverState, p_old, X_old, n_old)

Compute the primal residual at current iterate $k$ given the necessary values $p_{k-1}, X_{k-1}$, and $n_{k-1}$ from the previous iterate.

\[\lVert \frac{1}{σ}\operatorname{retr}^{-1}_{x_{k}}x_{k-1} - V_{x_k←m_k} \bigl( DΛ^*(m_k)\bigl[V_{n_k← n_{k-1}}X_{k-1} - X_k \bigr]\bigr) \rVert\]

where $V_{⋅←⋅}$ is the vector transport used in the ChambollePockState.

source