Difference of convex
Difference of convex algorithm
Manopt.difference_of_convex_algorithm — Functiondifference_of_convex_algorithm(M, f, g, ∂h, p=rand(M); kwargs...)
difference_of_convex_algorithm(M, mdco, p; kwargs...)
difference_of_convex_algorithm!(M, f, g, ∂h, p; kwargs...)
difference_of_convex_algorithm!(M, mdco, p; kwargs...)Compute the difference of convex algorithm [BFSS24] to minimize
\[ \operatorname*{arg\,min}_{p∈\mathcal M}\ g(p) - h(p)\]
where you need to provide $f(p) = g(p) - h(p)$, $g$ and the subdifferential $∂h$ of $h$.
This algorithm performs the following steps given a start point p= $p^{(0)}$. Then repeat for $k=0,1,…$
- Take $X^{(k)} ∈ ∂h(p^{(k)})$
- Set the next iterate to the solution of the subproblem
\[ p^{(k+1)} ∈ \operatorname*{arg\,min}_{q ∈ \mathcal M} g(q) - ⟨X^{(k)}, \log_{p^{(k)}}q⟩\]
until the stopping criterion (see the stopping_criterion keyword is fulfilled.
Input
M::AbstractManifold: a Riemannian manifold $\mathcal M$f: a cost function $f: \mathcal M→ ℝ$ implemented as(M, p) -> vtotal cost functionf = g - hg: the smooth part $g$of the cost function∂h: the subgradient $∂h: \mathcal M → T\mathcal M$ of $h$ as a function(M, p) -> Xor a function(M, X, p) -> XcomputingXin-place. This function should always only return one element from the subgradient.p: a point on the manifold $\mathcal M$
Keyword arguments
evaluation=AllocatingEvaluation(): specify whether the functions that return an array, for example a point or a tangent vector, work by allocating its result (AllocatingEvaluation) or whether they modify their input argument to return the result therein (InplaceEvaluation). Since usually the first argument is the manifold, the modified argument is the second.gradient=nothing: specify $\operatorname{grad} f$, for debug / analysis or enhancing thestopping_criterion=grad_g=nothing: specify the gradient ofg. If specified, a subsolver is automatically set up.stopping_criterion=StopAfterIteration(200)|StopWhenChangeLess(1e-8): a functor indicating that the stopping criterion is fulfilledg=nothing: specify the functiongIf specified, a subsolver is automatically set up.sub_cost=LinearizedDCCost(g, p, initial_vector): a cost to be used within the defaultsub_problem. This is used to define thesub_objective=keyword and has hence no effect, if you setsub_objectivedirectly.sub_grad=LinearizedDCGrad(grad_g, p, initial_vector; evaluation=evaluation): gradient to be used within the defaultsub_problem. This is used to define thesub_objective=keyword and has hence no effect, if you setsub_objectivedirectly.sub_hess: (a finite difference approximation usingsub_gradby default): specify a Hessian of thesub_cost, which the default solver, seesub_state=needs. This is used to define thesub_objective=keyword and has hence no effect, if you setsub_objectivedirectly.sub_kwargs=(;): a named tuple of keyword arguments that are passed todecorate_objective!of the sub solvers objective, thedecorate_state!of the subsovlers state, and the sub state constructor itself.sub_objective: a gradient or Hessian objective based onsub_cost=,sub_grad=, andsub_hessif provided the objective used withinsub_problem. This is used to define thesub_problem=keyword and has hence no effect, if you setsub_problemdirectly.sub_state=(GradientDescentStateorTrustRegionsStateifsub_hessis provided): a state to specify the sub solver to use. For a closed form solution, this indicates the type of function.sub_problem=DefaultManoptProblem(M, sub_objective): specify a problem for a solver or a closed form solution function, which can be allocating or in-place.sub_stopping_criterion=StopAfterIteration(300)|StopWhenStepsizeLess(1e-9)|StopWhenGradientNormLess(1e-9): a stopping criterion used withing the defaultsub_state=This is used to define thesub_state=keyword and has hence no effect, if you setsub_statedirectly.sub_stepsize=ArmijoLinesearch(M)) specify a step size used within thesub_state. This is used to define thesub_state=keyword and has hence no effect, if you setsub_statedirectly.X=zero_vector(M, p): a tangent vector at the point $p$ on the manifold $\mathcal M$to specify the representation of a tangent vector
All other keyword arguments are passed to decorate_state! for state decorators or decorate_objective! for objective decorators, respectively.
Output
The obtained approximate minimizer $p^*$. To obtain the whole final state of the solver, see get_solver_return for details, especially the return_state= keyword.
Manopt.difference_of_convex_algorithm! — Functiondifference_of_convex_algorithm(M, f, g, ∂h, p=rand(M); kwargs...)
difference_of_convex_algorithm(M, mdco, p; kwargs...)
difference_of_convex_algorithm!(M, f, g, ∂h, p; kwargs...)
difference_of_convex_algorithm!(M, mdco, p; kwargs...)Compute the difference of convex algorithm [BFSS24] to minimize
\[ \operatorname*{arg\,min}_{p∈\mathcal M}\ g(p) - h(p)\]
where you need to provide $f(p) = g(p) - h(p)$, $g$ and the subdifferential $∂h$ of $h$.
This algorithm performs the following steps given a start point p= $p^{(0)}$. Then repeat for $k=0,1,…$
- Take $X^{(k)} ∈ ∂h(p^{(k)})$
- Set the next iterate to the solution of the subproblem
\[ p^{(k+1)} ∈ \operatorname*{arg\,min}_{q ∈ \mathcal M} g(q) - ⟨X^{(k)}, \log_{p^{(k)}}q⟩\]
until the stopping criterion (see the stopping_criterion keyword is fulfilled.
Input
M::AbstractManifold: a Riemannian manifold $\mathcal M$f: a cost function $f: \mathcal M→ ℝ$ implemented as(M, p) -> vtotal cost functionf = g - hg: the smooth part $g$of the cost function∂h: the subgradient $∂h: \mathcal M → T\mathcal M$ of $h$ as a function(M, p) -> Xor a function(M, X, p) -> XcomputingXin-place. This function should always only return one element from the subgradient.p: a point on the manifold $\mathcal M$
Keyword arguments
evaluation=AllocatingEvaluation(): specify whether the functions that return an array, for example a point or a tangent vector, work by allocating its result (AllocatingEvaluation) or whether they modify their input argument to return the result therein (InplaceEvaluation). Since usually the first argument is the manifold, the modified argument is the second.gradient=nothing: specify $\operatorname{grad} f$, for debug / analysis or enhancing thestopping_criterion=grad_g=nothing: specify the gradient ofg. If specified, a subsolver is automatically set up.stopping_criterion=StopAfterIteration(200)|StopWhenChangeLess(1e-8): a functor indicating that the stopping criterion is fulfilledg=nothing: specify the functiongIf specified, a subsolver is automatically set up.sub_cost=LinearizedDCCost(g, p, initial_vector): a cost to be used within the defaultsub_problem. This is used to define thesub_objective=keyword and has hence no effect, if you setsub_objectivedirectly.sub_grad=LinearizedDCGrad(grad_g, p, initial_vector; evaluation=evaluation): gradient to be used within the defaultsub_problem. This is used to define thesub_objective=keyword and has hence no effect, if you setsub_objectivedirectly.sub_hess: (a finite difference approximation usingsub_gradby default): specify a Hessian of thesub_cost, which the default solver, seesub_state=needs. This is used to define thesub_objective=keyword and has hence no effect, if you setsub_objectivedirectly.sub_kwargs=(;): a named tuple of keyword arguments that are passed todecorate_objective!of the sub solvers objective, thedecorate_state!of the subsovlers state, and the sub state constructor itself.sub_objective: a gradient or Hessian objective based onsub_cost=,sub_grad=, andsub_hessif provided the objective used withinsub_problem. This is used to define thesub_problem=keyword and has hence no effect, if you setsub_problemdirectly.sub_state=(GradientDescentStateorTrustRegionsStateifsub_hessis provided): a state to specify the sub solver to use. For a closed form solution, this indicates the type of function.sub_problem=DefaultManoptProblem(M, sub_objective): specify a problem for a solver or a closed form solution function, which can be allocating or in-place.sub_stopping_criterion=StopAfterIteration(300)|StopWhenStepsizeLess(1e-9)|StopWhenGradientNormLess(1e-9): a stopping criterion used withing the defaultsub_state=This is used to define thesub_state=keyword and has hence no effect, if you setsub_statedirectly.sub_stepsize=ArmijoLinesearch(M)) specify a step size used within thesub_state. This is used to define thesub_state=keyword and has hence no effect, if you setsub_statedirectly.X=zero_vector(M, p): a tangent vector at the point $p$ on the manifold $\mathcal M$to specify the representation of a tangent vector
All other keyword arguments are passed to decorate_state! for state decorators or decorate_objective! for objective decorators, respectively.
Output
The obtained approximate minimizer $p^*$. To obtain the whole final state of the solver, see get_solver_return for details, especially the return_state= keyword.
Difference of convex proximal point
Manopt.difference_of_convex_proximal_point — Functiondifference_of_convex_proximal_point(M, grad_h, p=rand(M); kwargs...)
difference_of_convex_proximal_point(M, mdcpo, p=rand(M); kwargs...)
difference_of_convex_proximal_point!(M, grad_h, p; kwargs...)
difference_of_convex_proximal_point!(M, mdcpo, p; kwargs...)Compute the difference of convex proximal point algorithm [SO15] to minimize
\[ \operatorname*{arg\,min}_{p∈\mathcal M} g(p) - h(p)\]
where you have to provide the subgradient $∂h$ of $h$ and either
- the proximal map $\operatorname{prox}_{λg}$ of
gas a functionprox_g(M, λ, p)orprox_g(M, q, λ, p) - the functions
gandgrad_gto compute the proximal map using a sub solver - your own sub-solver, specified by
sub_problem=andsub_state=
This algorithm performs the following steps given a start point p= $p^{(0)}$. Then repeat for $k=0,1,…$
- $X^{(k)} ∈ \operatorname{grad} h(p^{(k)})$
- $q^{(k)} = \operatorname{retr}_{p^{(k)}}(λ_kX^{(k)})$
- $r^{(k)} = \operatorname{prox}_{λ_kg}(q^{(k)})$
- $X^{(k)} = \operatorname{retr}^{-1}_{p^{(k)}}(r^{(k)})$
- Compute a stepsize $s_k$ and
- set $p^{(k+1)} = \operatorname{retr}_{p^{(k)}}(s_kX^{(k)})$.
until the stopping_criterion is fulfilled.
See [ACOO20] for more details on the modified variant, where steps 4-6 are slightly changed, since here the classical proximal point method for DC functions is obtained for $s_k = 1$ and one can hence employ usual line search method.
Input
M::AbstractManifold: a Riemannian manifold $\mathcal M$f: a cost function $f: \mathcal M→ ℝ$ implemented as(M, p) -> vtotal cost functionf = g - hgrad_h: the (Riemannian) gradient $\operatorname{grad}h: \mathcal M → T_{p}\mathcal M$ of h as a function(M, p) -> Xor a function(M, X, p) -> XcomputingXin-placep: a point on the manifold $\mathcal M$
Keyword arguments
λ: (k -> 1/2) a function returning the sequence of prox parameters $λ_k$cost=nothing: provide the costf, for debug reasons / analysisevaluation=AllocatingEvaluation(): specify whether the functions that return an array, for example a point or a tangent vector, work by allocating its result (AllocatingEvaluation) or whether they modify their input argument to return the result therein (InplaceEvaluation). Since usually the first argument is the manifold, the modified argument is the second.gradient=nothing: specify $\operatorname{grad} f$, for debug / analysis or enhancing thestopping_criterionprox_g=nothing: specify a proximal map for the sub problem or both of the followingg=nothing: specify the functiong.grad_g=nothing: specify the gradient ofg. If bothgandgrad_gare specified, a subsolver is automatically set up.inverse_retraction_method=default_inverse_retraction_method(M, typeof(p)): an inverse retraction $\operatorname{retr}^{-1}$ to use, see the section on retractions and their inversesretraction_method=default_retraction_method(M, typeof(p)): a retraction $\operatorname{retr}$ to use, see the section on retractionsstepsize=ConstantLength(): a functor inheriting fromStepsizeto determine a step sizestopping_criterion=StopAfterIteration(200)|StopWhenChangeLess(1e-8)): a functor indicating that the stopping criterion is fulfilled AStopWhenGradientNormLess(1e-8)is added with|, when agradientis provided.sub_cost=ProximalDCCost(g, copy(M, p), λ(1))): cost to be used within the defaultsub_problemthat is initialized as soon asgis provided. This is used to define thesub_objective=keyword and has hence no effect, if you setsub_objectivedirectly.sub_grad=ProximalDCGrad(grad_g, copy(M, p), λ(1); evaluation=evaluation): gradient to be used within the defaultsub_problem, that is initialized as soon asgrad_gis provided. This is used to define thesub_objective=keyword and has hence no effect, if you setsub_objectivedirectly.sub_hess: (a finite difference approximation usingsub_gradby default): specify a Hessian of thesub_cost, which the default solver, seesub_state=needs.sub_kwargs=(;): a named tuple of keyword arguments that are passed todecorate_objective!of the sub solvers objective, thedecorate_state!of the subsovlers state, and the sub state constructor itself.sub_objective: a gradient or Hessian objective based onsub_cost=,sub_grad=, andsub_hessif provided the objective used withinsub_problem. This is used to define thesub_problem=keyword and has hence no effect, if you setsub_problemdirectly.sub_problem=DefaultManoptProblem(M, sub_objective): specify a problem for a solver or a closed form solution function, which can be allocating or in-place.sub_state=(GradientDescentStateorTrustRegionsStateifsub_hessis provided): a state to specify the sub solver to use. For a closed form solution, this indicates the type of function.sub_stopping_criterion=(StopAfterIteration(300)|[StopWhenGradientNormLess](@ref)(1e-8): a functor indicating that the stopping criterion is fulfilled This is used to define thesubstate=keyword and has hence no effect, if you setsubstate` directly.
All other keyword arguments are passed to decorate_state! for state decorators or decorate_objective! for objective decorators, respectively.
Output
The obtained approximate minimizer $p^*$. To obtain the whole final state of the solver, see get_solver_return for details, especially the return_state= keyword.
Manopt.difference_of_convex_proximal_point! — Functiondifference_of_convex_proximal_point(M, grad_h, p=rand(M); kwargs...)
difference_of_convex_proximal_point(M, mdcpo, p=rand(M); kwargs...)
difference_of_convex_proximal_point!(M, grad_h, p; kwargs...)
difference_of_convex_proximal_point!(M, mdcpo, p; kwargs...)Compute the difference of convex proximal point algorithm [SO15] to minimize
\[ \operatorname*{arg\,min}_{p∈\mathcal M} g(p) - h(p)\]
where you have to provide the subgradient $∂h$ of $h$ and either
- the proximal map $\operatorname{prox}_{λg}$ of
gas a functionprox_g(M, λ, p)orprox_g(M, q, λ, p) - the functions
gandgrad_gto compute the proximal map using a sub solver - your own sub-solver, specified by
sub_problem=andsub_state=
This algorithm performs the following steps given a start point p= $p^{(0)}$. Then repeat for $k=0,1,…$
- $X^{(k)} ∈ \operatorname{grad} h(p^{(k)})$
- $q^{(k)} = \operatorname{retr}_{p^{(k)}}(λ_kX^{(k)})$
- $r^{(k)} = \operatorname{prox}_{λ_kg}(q^{(k)})$
- $X^{(k)} = \operatorname{retr}^{-1}_{p^{(k)}}(r^{(k)})$
- Compute a stepsize $s_k$ and
- set $p^{(k+1)} = \operatorname{retr}_{p^{(k)}}(s_kX^{(k)})$.
until the stopping_criterion is fulfilled.
See [ACOO20] for more details on the modified variant, where steps 4-6 are slightly changed, since here the classical proximal point method for DC functions is obtained for $s_k = 1$ and one can hence employ usual line search method.
Input
M::AbstractManifold: a Riemannian manifold $\mathcal M$f: a cost function $f: \mathcal M→ ℝ$ implemented as(M, p) -> vtotal cost functionf = g - hgrad_h: the (Riemannian) gradient $\operatorname{grad}h: \mathcal M → T_{p}\mathcal M$ of h as a function(M, p) -> Xor a function(M, X, p) -> XcomputingXin-placep: a point on the manifold $\mathcal M$
Keyword arguments
λ: (k -> 1/2) a function returning the sequence of prox parameters $λ_k$cost=nothing: provide the costf, for debug reasons / analysisevaluation=AllocatingEvaluation(): specify whether the functions that return an array, for example a point or a tangent vector, work by allocating its result (AllocatingEvaluation) or whether they modify their input argument to return the result therein (InplaceEvaluation). Since usually the first argument is the manifold, the modified argument is the second.gradient=nothing: specify $\operatorname{grad} f$, for debug / analysis or enhancing thestopping_criterionprox_g=nothing: specify a proximal map for the sub problem or both of the followingg=nothing: specify the functiong.grad_g=nothing: specify the gradient ofg. If bothgandgrad_gare specified, a subsolver is automatically set up.inverse_retraction_method=default_inverse_retraction_method(M, typeof(p)): an inverse retraction $\operatorname{retr}^{-1}$ to use, see the section on retractions and their inversesretraction_method=default_retraction_method(M, typeof(p)): a retraction $\operatorname{retr}$ to use, see the section on retractionsstepsize=ConstantLength(): a functor inheriting fromStepsizeto determine a step sizestopping_criterion=StopAfterIteration(200)|StopWhenChangeLess(1e-8)): a functor indicating that the stopping criterion is fulfilled AStopWhenGradientNormLess(1e-8)is added with|, when agradientis provided.sub_cost=ProximalDCCost(g, copy(M, p), λ(1))): cost to be used within the defaultsub_problemthat is initialized as soon asgis provided. This is used to define thesub_objective=keyword and has hence no effect, if you setsub_objectivedirectly.sub_grad=ProximalDCGrad(grad_g, copy(M, p), λ(1); evaluation=evaluation): gradient to be used within the defaultsub_problem, that is initialized as soon asgrad_gis provided. This is used to define thesub_objective=keyword and has hence no effect, if you setsub_objectivedirectly.sub_hess: (a finite difference approximation usingsub_gradby default): specify a Hessian of thesub_cost, which the default solver, seesub_state=needs.sub_kwargs=(;): a named tuple of keyword arguments that are passed todecorate_objective!of the sub solvers objective, thedecorate_state!of the subsovlers state, and the sub state constructor itself.sub_objective: a gradient or Hessian objective based onsub_cost=,sub_grad=, andsub_hessif provided the objective used withinsub_problem. This is used to define thesub_problem=keyword and has hence no effect, if you setsub_problemdirectly.sub_problem=DefaultManoptProblem(M, sub_objective): specify a problem for a solver or a closed form solution function, which can be allocating or in-place.sub_state=(GradientDescentStateorTrustRegionsStateifsub_hessis provided): a state to specify the sub solver to use. For a closed form solution, this indicates the type of function.sub_stopping_criterion=(StopAfterIteration(300)|[StopWhenGradientNormLess](@ref)(1e-8): a functor indicating that the stopping criterion is fulfilled This is used to define thesubstate=keyword and has hence no effect, if you setsubstate` directly.
All other keyword arguments are passed to decorate_state! for state decorators or decorate_objective! for objective decorators, respectively.
Output
The obtained approximate minimizer $p^*$. To obtain the whole final state of the solver, see get_solver_return for details, especially the return_state= keyword.
Solver states
Manopt.DifferenceOfConvexState — TypeDifferenceOfConvexState{Pr,St,P,T,SC<:StoppingCriterion} <:
AbstractManoptSolverStateA struct to store the current state of the [difference_of_convex_algorithm])(@ref). It comes in two forms, depending on the realisation of the subproblem.
Fields
p::P: a point on the manifold $\mathcal M$ storing the current iterateX::T: a tangent vector at the point $p$ on the manifold $\mathcal M$storing a subgradient at the current iteratesub_problem::Union{AbstractManoptProblem, F}: specify a problem for a solver or a closed form solution function, which can be allocating or in-place.sub_state::Union{AbstractManoptProblem, F}: a state to specify the sub solver to use. For a closed form solution, this indicates the type of function.stop::StoppingCriterion: a functor indicating that the stopping criterion is fulfilled
The sub task consists of a method to solve
\[ \operatorname*{arg\,min}_{q∈\mathcal M}\ g(p) - ⟨X, \log_p q⟩\]
is needed. Besides a problem and a state, one can also provide a function and an AbstractEvaluationType, respectively, to indicate a closed form solution for the sub task.
Constructors
DifferenceOfConvexState(M, sub_problem, sub_state; kwargs...)
DifferenceOfConvexState(M, sub_solver; evaluation=InplaceEvaluation(), kwargs...)Generate the state either using a solver from Manopt, given by an AbstractManoptProblem sub_problem and an AbstractManoptSolverState sub_state, or a closed form solution sub_solver for the sub-problem the function expected to be of the form (M, p, X) -> q or (M, q, p, X) -> q, where by default its AbstractEvaluationType evaluation is in-place of q. Here the elements passed are the current iterate p and the subgradient X of h can be passed to that function.
further keyword arguments
p=rand(M): a point on the manifold $\mathcal M$ to specify the initial valuestopping_criterion=StopAfterIteration(200): a functor indicating that the stopping criterion is fulfilledX=zero_vector(M, p): a tangent vector at the point $p$ on the manifold $\mathcal M$to specify the representation of a tangent vector
Manopt.DifferenceOfConvexProximalState — TypeDifferenceOfConvexProximalState{P, T, Pr, St, S<:Stepsize, SC<:StoppingCriterion, RTR<:AbstractRetractionMethod, ITR<:AbstractInverseRetractionMethod}
<: AbstractSubProblemSolverStateA struct to store the current state of the algorithm as well as the form. It comes in two forms, depending on the realisation of the subproblem.
Fields
inverse_retraction_method::AbstractInverseRetractionMethod: an inverse retraction $\operatorname{retr}^{-1}$ to use, see the section on retractions and their inversesp::P: a point on the manifold $\mathcal M$ storing the current iterateq::P: a point on the manifold $\mathcal M$ storing the gradient stepr::P: a point on the manifold $\mathcal M$ storing the result of the proximal mapretraction_method::AbstractRetractionMethod: a retraction $\operatorname{retr}$ to use, see the section on retractionsstepsize::Stepsize: a functor inheriting fromStepsizeto determine a step sizestop::StoppingCriterion: a functor indicating that the stopping criterion is fulfilledX,Y: the current gradient and descent direction, respectively their common type is set by the keywordXsub_problem::Union{AbstractManoptProblem, F}: specify a problem for a solver or a closed form solution function, which can be allocating or in-place.sub_state::Union{AbstractManoptProblem, F}: a state to specify the sub solver to use. For a closed form solution, this indicates the type of function.
Constructor
DifferenceOfConvexProximalState(M::AbstractManifold, sub_problem, sub_state; kwargs...)construct an difference of convex proximal point state
DifferenceOfConvexProximalState(M::AbstractManifold, sub_problem;
evaluation=AllocatingEvaluation(), kwargs...)
construct an difference of convex proximal point state, where sub_problem is a closed form solution with evaluation as type of evaluation.
Input
M::AbstractManifold: a Riemannian manifold $\mathcal M$sub_problem: specify a problem for a solver or a closed form solution function, which can be allocating or in-place.sub_state: a state to specify the sub solver to use. For a closed form solution, this indicates the type of function.
Keyword arguments
inverse_retraction_method=default_inverse_retraction_method(M, typeof(p)): an inverse retraction $\operatorname{retr}^{-1}$ to use, see the section on retractions and their inversesp=rand(M): a point on the manifold $\mathcal M$ to specify the initial valueretraction_method=default_retraction_method(M, typeof(p)): a retraction $\operatorname{retr}$ to use, see the section on retractionsstepsize=ConstantLength(): a functor inheriting fromStepsizeto determine a step sizestopping_criterion=StopWhenChangeLess`(1e-8): a functor indicating that the stopping criterion is fulfilledX=zero_vector(M, p): a tangent vector at the point $p$ on the manifold $\mathcal M$to specify the representation of a tangent vector
The difference of convex objective
Manopt.ManifoldDifferenceOfConvexObjective — TypeManifoldDifferenceOfConvexObjective{E} <: AbstractManifoldCostObjective{E}Specify an objective for a difference_of_convex_algorithm.
The objective $f: \mathcal M → ℝ$ is given as
\[ f(p) = g(p) - h(p)\]
where both $g$ and $h$ are convex, lower semicontinuous and proper. Furthermore the subdifferential $∂h$ of $h$ is required.
Fields
cost: an implementation of $f(p) = g(p)-h(p)$ as a functionf(M,p).∂h!!: a deterministic version of $∂h: \mathcal M → T\mathcal M$, in the sense that calling∂h(M, p)returns a subgradient of $h$ atpand if there is more than one, it returns a deterministic choice.
Note that the subdifferential might be given in two possible signatures
∂h(M,p)which does anAllocatingEvaluation∂h!(M, X, p)which does anInplaceEvaluationin place ofX.
as well as for the corresponding sub problem
Manopt.LinearizedDCCost — TypeLinearizedDCCostA functor (M,q) → ℝ to represent the inner problem of a ManifoldDifferenceOfConvexObjective. This is a cost function of the form
\[ F_{p_k,X_k}(p) = g(p) - ⟨X_k, \log_{p_k}p⟩\]
for a point p_k and a tangent vector X_k at p_k (for example outer iterates) that are stored within this functor as well.
Fields
ga functionpka point on a manifoldXka tangent vector atpk
Both interim values can be set using set_parameter!(::LinearizedDCCost, ::Val{:p}, p) and set_parameter!(::LinearizedDCCost, ::Val{:X}, X), respectively.
Constructor
LinearizedDCCost(g, p, X)Manopt.LinearizedDCGrad — TypeLinearizedDCGradA functor (M,X,p) → ℝ to represent the gradient of the inner problem of a ManifoldDifferenceOfConvexObjective. This is a gradient function of the form
\[ F_{p_k,X_k}(p) = g(p) - ⟨X_k, \log_{p_k}p⟩\]
its gradient is given by using $F=F_1(F_2(p))$, where $F_1(X) = ⟨X_k,X⟩$ and $F_2(p) = \log_{p_k}p$ and the chain rule as well as the adjoint differential of the logarithmic map with respect to its argument for $D^*F_2(p)$
\[ \operatorname{grad} F(q) = \operatorname{grad}f(q) - DF_2^*(q)[X]\]
for a point pk and a tangent vector Xk at pk (the outer iterates) that are stored within this functor as well
Fields
grad_g!!the gradient of $g$ (see alsoLinearizedDCCost)pka point on a manifoldXka tangent vector atpk
Both interim values can be set using set_parameter!(::LinearizedDCGrad, ::Val{:p}, p) and set_parameter!(::LinearizedDCGrad, ::Val{:X}, X), respectively.
Constructor
LinearizedDCGrad(grad_g, p, X; evaluation=AllocatingEvaluation())Where you specify whether grad_g is AllocatingEvaluation or InplaceEvaluation, while this function still provides both signatures.
Manopt.ManifoldDifferenceOfConvexProximalObjective — TypeManifoldDifferenceOfConvexProximalObjective{E} <: ProblemSpecify an objective difference_of_convex_proximal_point algorithm. The problem is of the form
\[ \operatorname*{arg\,min}_{p∈\mathcal M} g(p) - h(p)\]
where both $g$ and $h$ are convex, lower semicontinuous and proper.
Fields
cost: implementation of $f(p) = g(p)-h(p)$gradient: the gradient of the costgrad_h!!: a function $\operatorname{grad}h: \mathcal M → T\mathcal M$,
Note that both the gradients might be given in two possible signatures as allocating or in-place.
Constructor
ManifoldDifferenceOfConvexProximalObjective(gradh; cost=nothing, gradient=nothing)an note that neither cost nor gradient are required for the algorithm, just for eventual debug or stopping criteria.
as well as for the corresponding sub problems
Manopt.ProximalDCCost — TypeProximalDCCostA functor (M, p) → ℝ to represent the inner cost function of a ManifoldDifferenceOfConvexProximalObjective. This is the cost function of the proximal map of g.
\[ F_{p_k}(p) = \frac{1}{2λ}d_{\mathcal M}(p_k,p)^2 + g(p)\]
for a point pk and a proximal parameter $λ$.
Fields
g- a functionpk- a point on a manifoldλ- the prox parameter
Both interim values can be set using set_parameter!(::ProximalDCCost, ::Val{:p}, p) and set_parameter!(::ProximalDCCost, ::Val{:λ}, λ), respectively.
Constructor
ProximalDCCost(g, p, λ)Manopt.ProximalDCGrad — TypeProximalDCGradA functor (M,X,p) → ℝ to represent the gradient of the inner cost function of a ManifoldDifferenceOfConvexProximalObjective. This is the gradient function of the proximal map cost function of g. Based on
\[ F_{p_k}(p) = \frac{1}{2λ}d_{\mathcal M}(p_k,p)^2 + g(p)\]
it reads
\[ \operatorname{grad} F_{p_k}(p) = \operatorname{grad}} g(p) - \frac{1}{λ}\log_p p_k\]
for a point pk and a proximal parameter λ.
Fields
grad_g- a gradient functionpk- a point on a manifoldλ- the prox parameter
Both interim values can be set using set_parameter!(::ProximalDCGrad, ::Val{:p}, p) and set_parameter!(::ProximalDCGrad, ::Val{:λ}, λ), respectively.
Constructor
ProximalDCGrad(grad_g, pk, λ; evaluation=AllocatingEvaluation())Where you specify whether grad_g is AllocatingEvaluation or InplaceEvaluation, while this function still always provides both signatures.
Helper functions
Manopt.get_subtrahend_gradient — FunctionX = get_subtrahend_gradient(amp, q)
get_subtrahend_gradient!(amp, X, q)Evaluate the (sub)gradient of the subtrahend h from within a ManifoldDifferenceOfConvexObjective amp at the point q (in place of X).
The evaluation is done in place of X for the !-variant. The T=AllocatingEvaluation problem might still allocate memory within. When the non-mutating variant is called with a T=InplaceEvaluation memory for the result is allocated.
X = get_subtrahend_gradient(M::AbstractManifold, dcpo::ManifoldDifferenceOfConvexProximalObjective, p)
get_subtrahend_gradient!(M::AbstractManifold, X, dcpo::ManifoldDifferenceOfConvexProximalObjective, p)Evaluate the gradient of the subtrahend $h$ from within a ManifoldDifferenceOfConvexProximalObjectivePat the pointp` (in place of X).
Technical details
The difference_of_convex_algorithm and difference_of_convex_proximal_point solver requires the following functions of a manifold to be available
- A
retract!(M, q, p, X); it is recommended to set thedefault_retraction_methodto a favourite retraction. If this default is set, aretraction_method=orretraction_method_dual=(for $\mathcal N$) does not have to be specified. - An
inverse_retract!(M, X, p, q); it is recommended to set thedefault_inverse_retraction_methodto a favourite retraction. If this default is set, ainverse_retraction_method=orinverse_retraction_method_dual=(for $\mathcal N$) does not have to be specified.
By default, one of the stopping criteria is StopWhenChangeLess, which either requires
- A
retract!(M, q, p, X); it is recommended to set thedefault_retraction_methodto a favourite retraction. If this default is set, aretraction_method=orretraction_method_dual=(for $\mathcal N$) does not have to be specified. - An
inverse_retract!(M, X, p, q); it is recommended to set thedefault_inverse_retraction_methodto a favourite retraction. If this default is set, ainverse_retraction_method=orinverse_retraction_method_dual=(for $\mathcal N$) does not have to be specified or thedistance(M, p, q)for said default inverse retraction. - A
copyto!(M, q, p)andcopy(M,p)for points. - By default the tangent vector storing the gradient is initialized calling
zero_vector(M,p). - everything the subsolver requires, which by default is the
trust_regionsor if you do not provide a Hessiangradient_descent.
Literature
- [ACOO20]
- Y. T. Almeida, J. X. Cruz Neto, P. R. Oliveira and J. C. Oliveira Souza. A modified proximal point method for DC functions on Hadamard manifolds. Computational Optimization and Applications 76, 649–673 (2020).
- [BFSS24]
- R. Bergmann, O. P. Ferreira, E. M. Santos and J. C. Souza. The difference of convex algorithm on Hadamard manifolds. Journal of Optimization Theory and Applications (2024).
- [SO15]
- J. C. Souza and P. R. Oliveira. A proximal point algorithm for DC fuctions on Hadamard manifolds. Journal of Global Optimization 63, 797–810 (2015).