# sigpy.alg.SDMM¶

class sigpy.alg.SDMM(A, d, lam, L, c, mu, rho, rho_max, rho_norm, eps_pri=1e-05, eps_dual=0.01, c_max=None, c_norm=None, max_cg_iter=30, max_iter=1000)[source]

Simultaneous Direction Method of Multipliers. Can be used for unconstrained or constrained optimization with several constraints.

Solves the problem of form:

\begin{align}\begin{aligned}\min_{x} \frac{1}{2}\left\|Ax-d\right\|_2^2 + \frac{\lambda}{2}\left\|x\right\|_2^2\\s.t. \left\|L_{i}x\right\|_2^2 < c_{i}\end{aligned}\end{align}

In SDMM, constraints are typically specified as a list of L linear operators and c constraints. This algorithm gives the user the option to provide either a list of L’s and c’s or a single maximum (c_max) and/or norm constraint (c_norm) with implicit L.

Solution variable x can be found in alg_method.x.

Parameters: A (Linop) – a system matrix Linop. d (array) – observation. lam (float) – scaling parameter. L (list of arrays) – list of constraint linear operator arrays. If not used, provide empty list {}. c (list of floats) – list of constraints, constraining the L2 norm of $$L_{i}x$$ mu (float) – proximal scaling factor. rho (list of floats) – list of L scaling parameters, which each one corresponding to one L constraint linear array. rho_max (float) – max constraint scaling parameter (if c_max provided). rho_norm (float) – norm constraint scaling parameter (if c_norm provided). eps_pri (float) – primal variable error tolerance. eps_dual (float) – dual variable error tolerance. c_max (float) – maximum value constraint. c_norm (float) – norm constraint. max_cg_iter (int) – maximum number of unconstrained CG iterations per SDMM iteration. max_iter (int) – maximum number of SDMM iterations.

References

Moolekamp, F. and Melchior, P. (2017). ‘Block-Simultaneous Direction Method of Multipliers: A proximal primal-dual splitting algorithm for nonconvex problems with multiple constraints.’ arXiv.

__init__(A, d, lam, L, c, mu, rho, rho_max, rho_norm, eps_pri=1e-05, eps_dual=0.01, c_max=None, c_norm=None, max_cg_iter=30, max_iter=1000)[source]

Initialize self. See help(type(self)) for accurate signature.

Methods

 Amult(x, A, mu, lam) __init__(A, d, lam, L, c, mu, rho, rho_max, …) Initialize self. done() Return whether the algorithm is done. prox_muf(v, mu, A, x, d, lam, nCGiters) prox_rhog(v, c) prox_rhog_max(v, c) update() Perform one update step.