Primal-dual Riemannian semismooth Newton algorithm
The Primal-dual Riemannian semismooth Newton Algorithm is a second-order method derived from the ChambollePock algorithm.
The aim is to solve an optimization problem on a manifold with a cost function of the form
\[F(p) + G(Λ(p)),\]
where $F:\mathcal M → \overline{ℝ}$, $G:\mathcal N → \overline{ℝ}$, and $Λ:\mathcal M →\mathcal N$. If the manifolds $\mathcal M$ or $\mathcal N$ are not Hadamard, it has to be considered locally only, that is on geodesically convex sets $\mathcal C \subset \mathcal M$ and $\mathcal D \subset\mathcal N$ such that $Λ(\mathcal C) \subset \mathcal D$.
The algorithm comes down to applying the Riemannian semismooth Newton method to the rewritten primal-dual optimality conditions. Define the vector field $X: \mathcal{M} \times T_{n}^{*} \mathcal{N} \rightarrow T \mathcal{M} \times T_{n}^{*} \mathcal{N}$ as
\[X\left(p, \xi_{n}\right):=\left(\begin{array}{c} -\log _{p} \operatorname{prox}_{\sigma F}\left(\exp _{p}\left(\mathcal{P}_{p \leftarrow m}\left(-\sigma\left(D_{m} \Lambda\right)^{*}\left[\mathcal{P}_{\Lambda(m) \leftarrow n} \xi_{n}\right]\right)^{\sharp}\right)\right) \\ \xi_{n}-\operatorname{prox}_{\tau G_{n}^{*}}\left(\xi_{n}+\tau\left(\mathcal{P}_{n \leftarrow \Lambda(m)} D_{m} \Lambda\left[\log _{m} p\right]\right)^{\flat}\right) \end{array}\right)\]
and solve for $X(p,ξ_{n})=0$.
Given base points $m∈\mathcal C$, $n=Λ(m)∈\mathcal D$, initial primal and dual values $p^{(0)} ∈\mathcal C$, $ξ_{n}^{(0)} ∈ T_{n}^{*}\mathcal N$, and primal and dual step sizes $\sigma$, $\tau$.
The algorithm performs the steps $k=0,1,…$ (until a StoppingCriterion is reached)
- Choose any element
\[V^{(k)} ∈ ∂_C X(p^{(k)},ξ_n^{(k)})\]
of the Clarke generalized covariant derivative - Solve
\[V^{(k)} [(d_p^{(k)}, d_n^{(k)})] = - X(p^{(k)},ξ_n^{(k)})\]
in the vector space $T_{p^{(k)}} \mathcal{M} \times T_{n}^{*} \mathcal{N}$ - Update
\[p^{(k+1)} := \exp_{p^{(k)}}(d_p^{(k)})\]
and\[ξ_n^{(k+1)} := ξ_n^{(k)} + d_n^{(k)}\]
Furthermore you can exchange the exponential map, the logarithmic map, and the parallel transport by a retraction, an inverse retraction and a vector transport.
Finally you can also update the base points $m$ and $n$ during the iterations. This introduces a few additional vector transports. The same holds for the case that $Λ(m^{(k)})\neq n^{(k)}$ at some point. The solver performs the transports of the dual variable and of $DΛ(m)[⋅]$ to $n$; the transport $\mathcal{P}_{\Lambda(m) \leftarrow n} \xi_{n}$ inside the adjoint, however, is expected to be part of the provided adjoint_linearized_operator, which is called with m, n and $ξ_n$ for this purpose.
Manopt.primal_dual_semismooth_Newton — Function
primal_dual_semismooth_Newton(M, N, cost, p, X, m, n, prox_F, diff_prox_F, prox_G_dual, diff_prox_G_dual, linearized_forward_operator, adjoint_linearized_operator; kwargs...)
primal_dual_semismooth_Newton!(M, N, cost, p, X, m, n, prox_F, diff_prox_F, prox_G_dual, diff_prox_G_dual, linearized_forward_operator, adjoint_linearized_operator; kwargs...)Perform the Primal-Dual Riemannian semismooth Newton algorithm.
Given a cost function $\mathcal E: \mathcal M → \overline{ℝ}$ of the form
\[\mathcal E(p) = F(p) + G( Λ(p) ),\]
where $F: \mathcal M → \overline{ℝ}$, $G: \mathcal N → \overline{ℝ}$, and $Λ: \mathcal M → \mathcal N$. The remaining input parameters are
p, X: primal and dual start points $p∈\mathcal{M}$ and $X ∈ T_n\mathcal{N}$m,n: base points on $\mathcal{M}$ and $\mathcal{N}$, respectively.linearized_forward_operator: the linearization $DΛ(⋅)[⋅]$ of the operator $Λ(⋅)$.adjoint_linearized_operator: the adjoint $DΛ^*$ of the linearized operator $DΛ(m): T_{m}\mathcal{M} → T_{Λ(m)}\mathcal{N}$prox_F, prox_G_dual: the proximal maps of $F$ and $G^\ast_n$diff_prox_F, diff_prox_G_dual: the (Clarke Generalized) differentials of the proximal maps of $F$ and $G^\ast_n$
For more details on the algorithm, see [DL21].
Keyword arguments
callbacks::D = Dict{Symbol,Function}(): provided callback functions given either as a single function(symbol, problem, state, k)called in every hook or as a (vector of) pairs:hook => function, which are processed byprocess_callbacks_arg. As key you can either pass single symbol or an array of symbols to indicate a callback should be added in multiple placesdual_stepsize=1/sqrt(8): proximal parameter of the dual proxevaluation::AbstractEvaluationType=AllocatingEvaluation(): specify whether the functions that return an array, for example a point or a tangent vector, work by allocating their 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.inverse_retraction_method::AbstractInverseRetractionMethod=default_inverse_retraction_method(M, typeof(p)): an inverse retraction $\operatorname{retr}^{-1}$ to use, see the section on retractions and their inversesΛ=missing: the exact operator, that is required ifΛ(m)=ndoes not hold;missingindicates, that the forward operator is exact.primal_stepsize=1/sqrt(8): proximal parameter of the primal proxreg_param=1e-5: regularization parameter for the Newton matrixretraction_method::AbstractRetractionMethod=default_retraction_method(M, typeof(p)): a retraction $\operatorname{retr}$ to use, see the section on retractionsstopping_criterion::StoppingCriterion=StopAfterIteration(50): a functor indicating that the stopping criterion is fulfilledupdate_primal_base=missing: function to updatem(identity by default/missing)update_dual_base=missing: function to updaten(identity by default/missing)vector_transport_method::AbstractVectorTransportMethod=default_vector_transport_method(M, typeof(p)): a vector transport $\mathcal T_{⋅←⋅}$ to use, see the section on vector transports
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.primal_dual_semismooth_Newton! — Function
primal_dual_semismooth_Newton(M, N, cost, p, X, m, n, prox_F, diff_prox_F, prox_G_dual, diff_prox_G_dual, linearized_forward_operator, adjoint_linearized_operator; kwargs...)
primal_dual_semismooth_Newton!(M, N, cost, p, X, m, n, prox_F, diff_prox_F, prox_G_dual, diff_prox_G_dual, linearized_forward_operator, adjoint_linearized_operator; kwargs...)Perform the Primal-Dual Riemannian semismooth Newton algorithm.
Given a cost function $\mathcal E: \mathcal M → \overline{ℝ}$ of the form
\[\mathcal E(p) = F(p) + G( Λ(p) ),\]
where $F: \mathcal M → \overline{ℝ}$, $G: \mathcal N → \overline{ℝ}$, and $Λ: \mathcal M → \mathcal N$. The remaining input parameters are
p, X: primal and dual start points $p∈\mathcal{M}$ and $X ∈ T_n\mathcal{N}$m,n: base points on $\mathcal{M}$ and $\mathcal{N}$, respectively.linearized_forward_operator: the linearization $DΛ(⋅)[⋅]$ of the operator $Λ(⋅)$.adjoint_linearized_operator: the adjoint $DΛ^*$ of the linearized operator $DΛ(m): T_{m}\mathcal{M} → T_{Λ(m)}\mathcal{N}$prox_F, prox_G_dual: the proximal maps of $F$ and $G^\ast_n$diff_prox_F, diff_prox_G_dual: the (Clarke Generalized) differentials of the proximal maps of $F$ and $G^\ast_n$
For more details on the algorithm, see [DL21].
Keyword arguments
callbacks::D = Dict{Symbol,Function}(): provided callback functions given either as a single function(symbol, problem, state, k)called in every hook or as a (vector of) pairs:hook => function, which are processed byprocess_callbacks_arg. As key you can either pass single symbol or an array of symbols to indicate a callback should be added in multiple placesdual_stepsize=1/sqrt(8): proximal parameter of the dual proxevaluation::AbstractEvaluationType=AllocatingEvaluation(): specify whether the functions that return an array, for example a point or a tangent vector, work by allocating their 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.inverse_retraction_method::AbstractInverseRetractionMethod=default_inverse_retraction_method(M, typeof(p)): an inverse retraction $\operatorname{retr}^{-1}$ to use, see the section on retractions and their inversesΛ=missing: the exact operator, that is required ifΛ(m)=ndoes not hold;missingindicates, that the forward operator is exact.primal_stepsize=1/sqrt(8): proximal parameter of the primal proxreg_param=1e-5: regularization parameter for the Newton matrixretraction_method::AbstractRetractionMethod=default_retraction_method(M, typeof(p)): a retraction $\operatorname{retr}$ to use, see the section on retractionsstopping_criterion::StoppingCriterion=StopAfterIteration(50): a functor indicating that the stopping criterion is fulfilledupdate_primal_base=missing: function to updatem(identity by default/missing)update_dual_base=missing: function to updaten(identity by default/missing)vector_transport_method::AbstractVectorTransportMethod=default_vector_transport_method(M, typeof(p)): a vector transport $\mathcal T_{⋅←⋅}$ to use, see the section on vector transports
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.
Objective
Manopt.PrimalDualManifoldSemismoothNewtonObjective — Type
PrimalDualManifoldSemismoothNewtonObjective{TC, PF, DPF, PG, DPG, LFO, TALO, L} <: AbstractPrimalDualManifoldObjective{TC, PF}Describes a Problem for the Primal-dual Riemannian semismooth Newton algorithm. [DL21]
Fields
cost: $F + G(Λ(⋅))$ to evaluate interim cost function valueslinearized_forward_operator!: the linearization $DΛ(⋅)[⋅]$ of the operator $Λ(⋅)$.adjoint_linearized_operator!: the adjoint differential $(DΛ)^* : T\mathcal{N} → T\mathcal{M}$prox_f!: the proximal map belonging to $F$diff_prox_f!: the (Clarke Generalized) differential of the proximal maps of $F$prox_g_dual!: the proximal map belonging to $G^\ast_n$diff_prox_g_dual!: the (Clarke Generalized) differential of the proximal maps of $G^\ast_n$Λ!: the exact forward operator. This operator is required ifΛ(m)=ndoes not hold.
Constructor
PrimalDualManifoldSemismoothNewtonObjective(cost, prox_F, diff_prox_F, prox_G_dual, diff_prox_G_dual, linearized_forward_operator, adjoint_linearized_operator; Λ=missing, evaluation=AllocatingEvaluation())Manopt.get_differential_primal_prox — Function
Y = get_differential_primal_prox(M::AbstractManifold, pdsno::PrimalDualManifoldSemismoothNewtonObjective, σ, p, X)
get_differential_primal_prox!(M::AbstractManifold, Y, pdsno::PrimalDualManifoldSemismoothNewtonObjective, σ, p, X)Evaluate the differential proximal map of $F$ stored within PrimalDualManifoldSemismoothNewtonObjective
\[D\operatorname{prox}_{σF}(p)[X]\]
which can also be computed in place of Y.
Manopt.get_differential_primal_prox! — Function
Y = get_differential_primal_prox(M::AbstractManifold, pdsno::PrimalDualManifoldSemismoothNewtonObjective, σ, p, X)
get_differential_primal_prox!(M::AbstractManifold, Y, pdsno::PrimalDualManifoldSemismoothNewtonObjective, σ, p, X)Evaluate the differential proximal map of $F$ stored within PrimalDualManifoldSemismoothNewtonObjective
\[D\operatorname{prox}_{σF}(p)[X]\]
which can also be computed in place of Y.
Manopt.get_differential_dual_prox — Function
η = get_differential_dual_prox(N::AbstractManifold, pdsno::PrimalDualManifoldSemismoothNewtonObjective, n, τ, X, ξ)
get_differential_dual_prox!(N::AbstractManifold, η, pdsno::PrimalDualManifoldSemismoothNewtonObjective, n, τ, X, ξ)Evaluate the differential proximal map of $G_n^*$ stored within PrimalDualManifoldSemismoothNewtonObjective
\[D\operatorname{prox}_{τG_n^*}(X)[ξ]\]
which can also be computed in place of η.
Manopt.get_differential_dual_prox! — Function
η = get_differential_dual_prox(N::AbstractManifold, pdsno::PrimalDualManifoldSemismoothNewtonObjective, n, τ, X, ξ)
get_differential_dual_prox!(N::AbstractManifold, η, pdsno::PrimalDualManifoldSemismoothNewtonObjective, n, τ, X, ξ)Evaluate the differential proximal map of $G_n^*$ stored within PrimalDualManifoldSemismoothNewtonObjective
\[D\operatorname{prox}_{τG_n^*}(X)[ξ]\]
which can also be computed in place of η.
State
Manopt.PrimalDualSemismoothNewtonState — Type
PrimalDualSemismoothNewtonState <: AbstractPrimalDualSolverStateFields
callbacks::D: provided callback functions given as a dictionary with symbols as keysdual_stepsize::Float64: proximal parameter of the dual proxinverse_retraction_method::AbstractInverseRetractionMethod: an inverse retraction $\operatorname{retr}^{-1}$ to use, see the section on retractions and their inversesm::P: a point on the manifold $\mathcal{M}$n::Q: a point on the manifold $\mathcal{N}$p::P: a point on the manifold $\mathcal{M}$ storing the current iterateprimal_stepsize::Float64: proximal parameter of the primal proxregularization_parameter::Float64: regularization parameter for the Newton matrixretraction_method::AbstractRetractionMethod: a retraction $\operatorname{retr}$ to use, see the section on retractionsstop::StoppingCriterion: a functor indicating that the stopping criterion is fulfilledupdate_dual_base: function to update the dual baseupdate_primal_base: function to update the primal basevector_transport_method::AbstractVectorTransportMethod: a vector transport $\mathcal T_{⋅←⋅}$ to use, see the section on vector transportsX::T: a tangent vector at the point $n$ on the manifold $\mathcal{N}$
The functions update_primal_base and update_dual_base are called with an AbstractManoptProblem amp, an AbstractManoptSolverState ams and the current iteration k as arguments. If you activate these to be different from the default identity, you have to provide the exact forward operator Λ (by default missing) for the algorithm to work.
Constructor
PrimalDualSemismoothNewtonState(M::AbstractManifold, N::AbstractManifold; kwargs...)Generate a state for the primal_dual_semismooth_Newton.
Keyword arguments
callbacks::D = Dict{Symbol,Function}(): provided callback functions given as a dictionary with symbols as keysdual_stepsize=1/sqrt(8)inverse_retraction_method::AbstractInverseRetractionMethod=default_inverse_retraction_method(M, typeof(p)): an inverse retraction $\operatorname{retr}^{-1}$ to use, see the section on retractions and their inversesm=rand(M)n=rand(N)p=rand(M)primal_stepsize=1/sqrt(8)regularization_parameter=1e-5retraction_method::AbstractRetractionMethod=default_retraction_method(M, typeof(p)): a retraction $\operatorname{retr}$ to use, see the section on retractionsstopping_criterion::StoppingCriterion=StopAfterIteration(50): a functor indicating that the stopping criterion is fulfilledupdate_dual_base=missing: function(amp, ams, k) -> nto update the dual base point;missingkeepsnfixedupdate_primal_base=missing: function(amp, ams, k) -> mto update the primal base point;missingkeepsmfixedvector_transport_method::AbstractVectorTransportMethod=default_vector_transport_method(M, typeof(p)): a vector transport $\mathcal T_{⋅←⋅}$ to use, see the section on vector transportsX=zero_vector(N, n)
Internal functions
Manopt.construct_primal_dual_residual_vector — Function
construct_primal_dual_residual_vector(tmp::TwoManifoldProblem, pdsn::PrimalDualSemismoothNewtonState)Constructs the vector representation of $X(p^{(k)}, ξ_{n}^{(k)}) ∈ T_{p^{(k)}} \mathcal{M} \times T_{n}^{*} \mathcal{N}$
Manopt.construct_primal_dual_residual_covariant_derivative_matrix — Function
construct_primal_dual_residual_covariant_derivative_matrix(tmp::TwoManifoldProblem, pdsn::PrimalDualSemismoothNewtonState)Constructs the matrix representation of $V^{(k)}:T_{p^{(k)}} \mathcal{M} \times T_{n}^{*} \mathcal{N}\rightarrow T_{p^{(k)}} \mathcal{M} \times T_{n}^{*} \mathcal{N}$
Solver specific debug output
DebugDualBaseIterate, DebugDualBaseChange, DebugPrimalBaseIterate, DebugPrimalBaseChange, DebugDualChange, DebugDualIterate, DebugDualResidual, DebugPrimalChange, DebugPrimalIterate, DebugPrimalResidual, DebugPrimalDualResidual
Technical details
The primal_dual_semismooth_Newton solver requires the following functions of a manifold to be available for both the manifolds $\mathcal M$ and $\mathcal N$
- A
retract!(M, q, p, X); it is recommended to set thedefault_retraction_methodto a favorite retraction. If this default is set, aretraction_method=does not have to be specified. - An
inverse_retract!(M, X, p, q); it is recommended to set thedefault_inverse_retraction_methodto a favorite inverse retraction. If this default is set, aninverse_retraction_method=does not have to be specified. - A
vector_transport_to!(M, Y, p, X, q); it is recommended to set thedefault_vector_transport_methodto a favorite vector transport. If this default is set, avector_transport_method=does not have to be specified. - A
copyto!(M, q, p)andcopy(M,p)for points. - A
get_basisfor theDefaultOrthonormalBasis, together withget_coordinates,get_vectorandmanifold_dimension, on both $\mathcal M$ and $\mathcal N$, to represent the Newton system as a matrix expandlog(on $\mathcal M$)- A
DiagonalizingOrthonormalBasisto compute the differentials of the exponential and logarithmic map - By default the tangent vectors are initialized calling
zero_vector(M,p).
Literature
- [DL21]
- W. Diepeveen and J. Lellmann. An Inexact Semismooth Newton Method on Riemannian Manifolds with Application to Duality-Based Total Variation Denoising. SIAM Journal on Imaging Sciences 14, 1565–1600 (2021), arXiv:2102.10309.