ConvTwoBlockCnstrnt specialises ADMMTwoBlockCnstrnt for problems of the form

\[\begin{split}\mathrm{argmin}_{\mathbf{x},\mathbf{y}_0,\mathbf{y}_1} \; g_0(\mathbf{y}_0) + g_1(\mathbf{y}_1) \;\text{such that}\; \left( \begin{array}{c} D \\ I \end{array} \right) \mathbf{x} - \left( \begin{array}{c} \mathbf{y}_0 \\ \mathbf{y}_1 \end{array} \right) = \left( \begin{array}{c} \mathbf{s} \\ \mathbf{0} \end{array} \right) \;\;,\end{split}\]

where \(D \mathbf{x} = \sum_m \mathbf{d}_m * \mathbf{x}_m\), intended to solve problems that have the form

\[\mathrm{argmin}_\mathbf{x} \; g_0(D \mathbf{x} - \mathbf{s}) + g_1(\mathbf{x})\]

prior to variable splitting.

See ConvBPDNMaskDcpl as an example of a class derived from ConvTwoBlockCnstrnt.

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


The __init__ method of the derived class should call the ConvTwoBlockCnstrnt __init__ method to ensure proper initialisation.

Block Access

Block access methods are as described in Block Access, except that ConvTwoBlockCnstrnt.block_sep0 and ConvTwoBlockCnstrnt.block_cat override ADMMTwoBlockCnstrnt.block_sep and ADMMTwoBlockCnstrnt.block_cat respectively, for the following reason. In ConvTwoBlockCnstrnt, block 0 has the same shape as input \(\mathbf{s}\), i.e. \(N \times C \times K \times 1\) (assuming two spatial dimensions), while block 1 has the dimensions of \(\mathbf{x}\), i.e. \(N \times 1 \times K \times M\) (again, assuming two spatial dimensions). In order to allow the two blocks to be concatenated into a single array, the channel and filter axes are swapped prior to concatenation and after separation.

Update Steps

The update steps are as described in Update Steps. Typically only the \(\mathbf{y}\) update ADMM.ystep will need to be overridden since a full implementation of the \(\mathbf{x}\) update ADMM.xstep is provided.

Constraint Definition

The constraint definition methods ADMMTwoBlockCnstrnt.cnst_A, ADMMTwoBlockCnstrnt.cnst_AT, ADMMTwoBlockCnstrnt.cnst_B, and ADMMTwoBlockCnstrnt.cnst_c are inherited from ADMMTwoBlockCnstrnt, and ConvTwoBlockCnstrnt.cnst_A0, ConvTwoBlockCnstrnt.cnst_A0T, and ConvTwoBlockCnstrnt.cnst_c0 defined to implement the block form constraint

\[\begin{split}\left( \begin{array}{c} D \\ I \end{array} \right) \mathbf{x} - \left( \begin{array}{c} \mathbf{y}_0 \\ \mathbf{y}_1 \end{array} \right) = \left( \begin{array}{c} \mathbf{s} \\ \mathbf{0} \end{array} \right)\end{split}\]

so that a derived class need typically not override any of these methods.

Residual Evaluation

The residual evaluation methods ADMMTwoBlockCnstrnt.rsdl_r, ConvTwoBlockCnstrnt.rsdl_s, ADMMTwoBlockCnstrnt.rsdl_rn, ConvTwoBlockCnstrnt.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 ADMMTwoBlockCnstrnt.