ADMMTwoBlockCnstrnt specialises ADMM for problems of the form

$\begin{split}\mathrm{argmin}_{\mathbf{x},\mathbf{y}_0,\mathbf{y}_1} \; f(\mathbf{x}) + g_0(\mathbf{y}_0) + g_0(\mathbf{y}_1) \;\text{such that}\; \left( \begin{array}{c} A_0 \\ A_1 \end{array} \right) \mathbf{x} - \left( \begin{array}{c} \mathbf{y}_0 \\ \mathbf{y}_1 \end{array} \right) = \left( \begin{array}{c} \mathbf{c}_0 \\ \mathbf{c}_1 \end{array} \right) \;\;,\end{split}$

intended to solve problems that have the form

$\mathrm{argmin}_{\mathbf{x}} \; f(\mathbf{x}) + g_0(A_0 \mathbf{x}) + g_1(A_1 \mathbf{x})$

prior to variable splitting.

See bpdn.MinL1InL2Ball as an example of a class derived from ADMMTwoBlockCnstrnt.

The methods of ADMMTwoBlockCnstrnt that are relevant to an implementer of a derived class are described in the following sections.

## Initialisation¶

The __init__ method of the derived class should call the ADMMTwoBlockCnstrnt __init__ method to ensure proper initialisation. The interface is similar to that of ADMM __init__ method except for the introduction of parameters blkaxis and blkidx that specify how the blocks of $$\mathbf{y}$$ are concatenated into a single array.

## Block Access¶

The following methods provide access to the block components of the arrays representing $$\mathbf{y}$$ or $$\mathbf{u}$$:

## Update Steps¶

The update steps are as described in Update Steps. The $$\mathbf{y}$$ update ADMM.ystep will typically make use of the block access methods described above to apply separate updates to the blocks $$\mathbf{y}_0$$ and $$\mathbf{y}_1$$.

## Constraint Definition¶

The constraint definition methods ADMMTwoBlockCnstrnt.cnst_A, ADMMTwoBlockCnstrnt.cnst_AT, ADMMTwoBlockCnstrnt.cnst_B, and ADMMTwoBlockCnstrnt.cnst_c are defined to implement the block form constraint

$\begin{split}\left( \begin{array}{c} A_0 \\ A_1 \end{array} \right) \mathbf{x} - \left( \begin{array}{c} \mathbf{y}_0 \\ \mathbf{y}_1 \end{array} \right) = \left( \begin{array}{c} \mathbf{c}_0 \\ \mathbf{c}_1 \end{array} \right) \;\;.\end{split}$

A derived class should override the following methods:

The default definitions are $$A_0 = I$$, $$A_1 = I$$, $$\mathbf{c}_0 = \mathbf{0}$$, and $$\mathbf{c}_1 = \mathbf{0}$$; the corresponding methods need not be overridden where these are the desired choices.

## Residual Evaluation¶

The residual evaluation methods ADMMTwoBlockCnstrnt.rsdl_r, ADMMTwoBlockCnstrnt.rsdl_s, ADMMTwoBlockCnstrnt.rsdl_rn, ADMMTwoBlockCnstrnt.rsdl_sn are all appropriately defined in terms of the constraint definition methods described above, 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 main exception is that ADMMTwoBlockCnstrnt.obfn_g is defined as the sum of the values returned by ADMMTwoBlockCnstrnt.obfn_g0 and ADMMTwoBlockCnstrnt.obfn_g1. A derived class may either just override these two methods, or override ADMMTwoBlockCnstrnt.obfn_g (or ADMM.eval_objfn) itself.