Basis pursuit

The minimization problem

\[\min_z \| z \|_1 \text{ such that } A z = b,\]

is referred to as basis pursuit and is well-known to promote sparse solutions.

The following functions were inspired by a simple basis pursuit ADMM implementation due to Boyd et al. Elemental’s implementations use parallel (dense) linear algebra and allows the user to choose between either directly computing a (thresholded-)pseudoinverse or an LQ factorization. The return value is the number of performed ADMM iterations.

C++ API

Int BasisPursuit(const Matrix<F> &A, const Matrix<F> &b, Matrix<F> &z, Base<F> rho = 1, Base<F> alpha = 1.2, Int maxIter = 500, Base<F> absTol = 1e-6, Base<F> relTol = 1e-4, bool usePinv = false, Base<F> pinvTol = 0, bool progress = true)
Int BasisPursuit(const AbstractDistMatrix<F> &A, const AbstractDistMatrix<F> &b, AbstractDistMatrix<F> &z, Base<F> rho = 1, Base<F> alpha = 1.2, Int maxIter = 500, Base<F> absTol = 1e-6, Base<F> relTol = 1e-4, bool usePinv = false, Base<F> pinvTol = 0, bool progress = true)

Implementation

Example driver

Parameters

Input/Output

Explanation

A

Input

part of constraint \(Ax=b\)

b

Input

part of constraint \(Ax=b\)

z

Output

primal solution (second term)

rho

Input

augmented-Lagrangian parameter

alpha

Input

over-relaxation parameter (usually in \([1,1.8]\))

maxIter

Input

maximum number of ADMM iterations

absTol

Input

absolute convergence tolerance

relTol

Input

relative convergence tolerance

usePinv

Input

directly compute a pseudoinverse?

pinvTol

Input

the pseudoinverse inversion tolerance

progress

Input

display detailed progress information?

C API

ElError ElBasisPursuit_s(ElConstMatrix_s A, ElConstMatrix_s b, ElMatrix_s z, ElInt* numIts)
ElError ElBasisPursuit_d(ElConstMatrix_d A, ElConstMatrix_d b, ElMatrix_d z, ElInt* numIts)
ElError ElBasisPursuit_c(ElConstMatrix_c A, ElConstMatrix_c b, ElMatrix_c z, ElInt* numIts)
ElError ElBasisPursuit_z(ElConstMatrix_z A, ElConstMatrix_z b, ElMatrix_z z, ElInt* numIts)
ElError ElBasisPursuitDist_s(ElConstMatrix_s A, ElConstMatrix_s b, ElMatrix_s z, ElInt* numIts)
ElError ElBasisPursuitDist_d(ElConstMatrix_d A, ElConstMatrix_d b, ElMatrix_d z, ElInt* numIts)
ElError ElBasisPursuitDist_c(ElConstMatrix_c A, ElConstMatrix_c b, ElMatrix_c z, ElInt* numIts)
ElError ElBasisPursuitDist_z(ElConstMatrix_z A, ElConstMatrix_z b, ElMatrix_z z, ElInt* numIts)

TODO: Expert versions