def __init__(self, D0, S, lmbda=None, opt=None): """ Initialise a BPDNDictLearn object with problem size and options. Parameters ---------- D0 : array_like, shape (N, M) Initial dictionary matrix S : array_like, shape (N, K) Signal vector or matrix lmbda : float Regularisation parameter opt : :class:`BPDNDictLearn.Options` object Algorithm options """ if opt is None: opt = BPDNDictLearn.Options() self.opt = opt # Normalise dictionary according to D update options D0 = cmod.getPcn(opt['CMOD', 'ZeroMean'])(D0) # Modify D update options to include initial values for Y and U Nc = D0.shape[1] opt['CMOD'].update({'Y0' : D0, 'U0' : np.zeros((S.shape[0], Nc))}) # Create X update object xstep = bpdn.BPDN(D0, S, lmbda, opt['BPDN']) # Create D update object Nm = S.shape[1] dstep = cmod.CnstrMOD(xstep.Y, S, (Nc, Nm), opt['CMOD']) # Configure iteration statistics reporting isc = dictlrn.IterStatsConfig( isfld = ['Iter', 'ObjFun', 'DFid', 'RegL1', 'Cnstr', 'XPrRsdl', 'XDlRsdl', 'XRho', 'DPrRsdl', 'DDlRsdl', 'DRho', 'Time'], isxmap = {'ObjFun' : 'ObjFun', 'DFid' : 'DFid', 'RegL1' : 'RegL1', 'XPrRsdl' : 'PrimalRsdl', 'XDlRsdl' : 'DualRsdl', 'XRho' : 'Rho'}, isdmap = {'Cnstr' : 'Cnstr', 'DPrRsdl' : 'PrimalRsdl', 'DDlRsdl' : 'DualRsdl', 'DRho' : 'Rho'}, evlmap = {}, hdrtxt = ['Itn', 'Fnc', 'DFid', u('ℓ1'), 'Cnstr', 'r_X', 's_X', u('ρ_X'), 'r_D', 's_D', u('ρ_D')], hdrmap = {'Itn' : 'Iter', 'Fnc' : 'ObjFun', 'DFid' : 'DFid', u('ℓ1') : 'RegL1', 'Cnstr' : 'Cnstr', 'r_X' : 'XPrRsdl', 's_X' : 'XDlRsdl', u('ρ_X') : 'XRho', 'r_D' : 'DPrRsdl', 's_D' : 'DDlRsdl', u('ρ_D') : 'DRho'} ) # Call parent constructor super(BPDNDictLearn, self).__init__(xstep, dstep, opt, isc)
def __init__(self, D0, S, lmbda=None, opt=None): """ | **Call graph** .. image:: ../_static/jonga/bpdndl_init.svg :width: 20% :target: ../_static/jonga/bpdndl_init.svg | Parameters ---------- D0 : array_like, shape (N, M) Initial dictionary matrix S : array_like, shape (N, K) Signal vector or matrix lmbda : float Regularisation parameter opt : :class:`BPDNDictLearn.Options` object Algorithm options """ if opt is None: opt = BPDNDictLearn.Options() self.opt = opt # Normalise dictionary according to D update options D0 = cmod.getPcn(opt['CMOD', 'ZeroMean'])(D0) # Modify D update options to include initial values for Y and U Nc = D0.shape[1] opt['CMOD'].update({'Y0': D0, 'U0': np.zeros((S.shape[0], Nc))}) # Create X update object xstep = bpdn.BPDN(D0, S, lmbda, opt['BPDN']) # Create D update object Nm = S.shape[1] dstep = cmod.CnstrMOD(xstep.Y, S, (Nc, Nm), opt['CMOD']) # Configure iteration statistics reporting if self.opt['AccurateDFid']: isxmap = {'XPrRsdl': 'PrimalRsdl', 'XDlRsdl': 'DualRsdl', 'XRho': 'Rho'} evlmap = {'ObjFun': 'ObjFun', 'DFid': 'DFid', 'RegL1': 'RegL1'} else: isxmap = {'ObjFun': 'ObjFun', 'DFid': 'DFid', 'RegL1': 'RegL1', 'XPrRsdl': 'PrimalRsdl', 'XDlRsdl': 'DualRsdl', 'XRho': 'Rho'} evlmap = {} isc = dictlrn.IterStatsConfig( isfld=['Iter', 'ObjFun', 'DFid', 'RegL1', 'Cnstr', 'XPrRsdl', 'XDlRsdl', 'XRho', 'DPrRsdl', 'DDlRsdl', 'DRho', 'Time'], isxmap=isxmap, isdmap={'Cnstr': 'Cnstr', 'DPrRsdl': 'PrimalRsdl', 'DDlRsdl': 'DualRsdl', 'DRho': 'Rho'}, evlmap=evlmap, hdrtxt=['Itn', 'Fnc', 'DFid', u('ℓ1'), 'Cnstr', 'r_X', 's_X', u('ρ_X'), 'r_D', 's_D', u('ρ_D')], hdrmap={'Itn': 'Iter', 'Fnc': 'ObjFun', 'DFid': 'DFid', u('ℓ1'): 'RegL1', 'Cnstr': 'Cnstr', 'r_X': 'XPrRsdl', 's_X': 'XDlRsdl', u('ρ_X'): 'XRho', 'r_D': 'DPrRsdl', 's_D': 'DDlRsdl', u('ρ_D'): 'DRho'} ) # Call parent constructor super(BPDNDictLearn, self).__init__(xstep, dstep, opt, isc)
# X and D update options lmbda = 0.1 optx = bpdn.BPDN.Options({ 'Verbose': False, 'MaxMainIter': 1, 'rho': 50.0 * lmbda + 0.5 }) optd = cmod.CnstrMOD.Options({ 'Verbose': False, 'MaxMainIter': 1, 'rho': S.shape[1] / 200.0 }) # Normalise dictionary according to D update options D0 = cmod.getPcn(optd['ZeroMean'])(D0) # Update D update options to include initial values for Y and U optd.update({'Y0': D0, 'U0': np.zeros((S.shape[0], D0.shape[1]))}) # Create X update object xstep = bpdn.BPDN(D0, S, lmbda, optx) # Create D update object dstep = cmod.CnstrMOD(None, S, (D0.shape[1], S.shape[1]), optd) # Create DictLearn object opt = dictlrn.DictLearn.Options({'Verbose': True, 'MaxMainIter': 100}) d = dictlrn.DictLearn(xstep, dstep, opt) Dmx = d.solve() print("DictLearn solve time: %.2fs" % d.timer.elapsed('solve'))