Source code for monalisa.optim._prox_one_norm
"""Port of src/linSpace/bmProx_oneNorm.m."""
import numpy as np
from monalisa._mat import cell_from_items, cell_items, cell_shape, iscell, msize, single
def _soft(w, s):
plus = (w > s).astype(np.float32)
minus = (w < -s).astype(np.float32)
return plus * (w - s) + minus * (w + s)
[docs]
def prox_one_norm(w, s):
"""Proximal operator of ``s * ||.||_1``: soft thresholding (real and imaginary
parts separately for complex data), single precision."""
if iscell(w):
return cell_from_items([prox_one_norm(a, s) for a in cell_items(w)], cell_shape(w))
argSize = msize(w)
w = single(np.ravel(np.asarray(w), order="F"))
s = np.float32(np.abs(np.asarray(s)).item())
if not np.iscomplexobj(w):
z = _soft(w, s)
else:
z = (_soft(w.real, s) + 1j * _soft(w.imag, s)).astype(np.complex64)
return np.reshape(z, argSize, order="F")