ADMMConsensus¶
ADMMConsensus
specialises ADMM
for solving
optimisation problems of the form
\[\mathrm{argmin}_{\mathbf{x}} \; \sum_{i = 0}^{N_b - 1} f_i(\mathbf{x}) + g(\mathbf{x})\]
via an ADMM problem of the form
See ConvCnstrMOD_Consensus
as an example of a class derived
from ADMMConsensus
, or see the simple usage example.
Classes derived from ADMMConsensus
should override/define
the methods and attributes in the following sections.
Initialisation¶
The __init__
method of the derived class should call the
ADMMConsensus
__init__
method to ensure proper
initialisation. Note that this method assumes that the ADMM consensus
component blocks in working variable \(\mathbf{x}\) will be stacked
on the final array index, and defines attribute self.xshape
accordingly.
State variables \(\mathbf{y}\) and \(\mathbf{u}\) are
initialised to zero by inherited methods ADMM.yinit
and
ADMM.uinit
respectively (this behaviour is inherited from
ADMM
). These methods should be overridden if a different
initialization is desired.
Update Steps¶
The \(\mathbf{x}\) update method ADMMConsensus.xstep
calls ADMMConsensus.xistep
for each ADMM consensus component
block. In most cases a derived class will define
ADMMConsensus.xistep
rather than override
ADMMConsensus.xstep
. Method ADMMConsensus.xistep
should solve
\[\mathbf{x}_i^{(j+1)} = \mathrm{argmin}_{\mathbf{x}_i} \;\; f_i(\mathbf{x}_i) + \frac{\rho}{2} \left\| \mathbf{x}_i - \left( \mathbf{y}^{(j)} - \mathbf{u}_i^{(j)} \right) \right\|_2^2\]
setting a slice of self.X
on the final index from the result.
The \(\mathbf{y}\) update method ADMMConsensus.ystep
solves
\[\mathbf{y}^{(j+1)} = \mathrm{argmin}_{\mathbf{y}} \;\; g(\mathbf{y}) + \frac{N_b \rho}{2} \left\| \mathbf{y} - \mathbf{z}^{(j)} \right\|_2^2\]
where
\[\mathbf{z}^{(j)} = \sum_{i = 0}^{N_b - 1} \left( \mathbf{x}_i^{(j+1)} + \mathbf{u}_i^{(j)} \right) \;.\]
A class derived from ADMMConsensus
should override
ADMMConsensus.prox_g
to implement the proximal operator of
\(g(\cdot)\). Note that \(N_b \rho\) is passed as a parameter
to ADMMConsensus.prox_g
; it is the responsibility of the
implementer of this method to understand that it implements what is in
mathematical terms the proximal operator of \(g(\cdot)\) with
parameter \((N_b \rho)^{-1}\).
The dual variable update is
\[\mathbf{u}_i^{(j+1)} = \mathbf{u}_i^{(j)} + \mathbf{x}_i^{(j+1)} - \mathbf{y}^{(j+1)} \;.\]
This update is implemented in ADMM.ustep
, which will usually
not need to be overridden.
As in ADMM
, if one of the update steps makes use of
pre-computed values that depend on the penalty parameter self.rho
,
ADMM.rhochange
should be with a method that updates these
pre-computed values.
Constraint Definition¶
Class ADMMConsensus
overrides all of the methods in
Residual Evaluation and does not define any of the ADMM
constraint definition methods discussed in
Constraint Definition.
Residual Evaluation¶
The residual evaluation methods ADMMConsensus.rsdl_r
,
ADMMConsensus.rsdl_s
, ADMMConsensus.rsdl_rn
,
ADMMConsensus.rsdl_sn
are all appropriately defined for a
general ADMM consensus problem, and will typically not need to be
overridden.
Iteration Statistics¶
The iteration statistics mechanism, as described in
Iteration Statistics, is inherited largely unchanged from
ADMM
. The only exception is that
ADMMConsensus.obfn_f
is defined to evaluate the sum over
class for each ADMM consensus block to ADMMConsensus.obfn_fi
,
which should be overridden in a derived class if it is desired to use
this simple iteration statistics mechanism rather than override
ADMM.eval_objfn
.