nikcleju@13: # -*- coding: utf-8 -*- nikcleju@13: """ nikcleju@17: Algorithms for exact analysis recovery based on synthesis solvers (a.k.a. Analysis by Synthesis, ABS). nikcleju@17: Exact reconstruction. nikcleju@13: nikcleju@17: Author: Nicolae Cleju nikcleju@13: """ nikcleju@17: __author__ = "Nicolae Cleju" nikcleju@17: __license__ = "GPL" nikcleju@17: __email__ = "nikcleju@gmail.com" nikcleju@17: nikcleju@13: nikcleju@13: import numpy nikcleju@17: nikcleju@17: # Import synthesis solvers from pyCSalgos package nikcleju@13: import pyCSalgos.BP.l1eq_pd nikcleju@14: import pyCSalgos.BP.cvxopt_lp nikcleju@13: import pyCSalgos.OMP.omp_QR nikcleju@13: import pyCSalgos.SL0.SL0 nikcleju@13: import pyCSalgos.TST.RecommendedTST nikcleju@13: nikcleju@17: nikcleju@14: def bp(y,M,Omega,x0, pdtol=1e-3, pdmaxiter=50, cgtol=1e-8, cgmaxiter=200, verbose=False): nikcleju@17: """ nikcleju@17: ABS-exact: Basis Pursuit (based on l1magic toolbox) nikcleju@17: """ nikcleju@13: N,n = Omega.shape nikcleju@13: D = numpy.linalg.pinv(Omega) nikcleju@13: U,S,Vt = numpy.linalg.svd(D) nikcleju@13: Aextra = Vt[-(N-n):,:] nikcleju@13: nikcleju@13: # Create aggregate problem nikcleju@13: Atilde = numpy.vstack((numpy.dot(M,D), Aextra)) nikcleju@13: ytilde = numpy.concatenate((y,numpy.zeros(N-n))) nikcleju@13: nikcleju@14: return numpy.dot(D , pyCSalgos.BP.l1eq_pd.l1eq_pd(x0,Atilde,Atilde.T,ytilde, pdtol, pdmaxiter, cgtol, cgmaxiter, verbose)) nikcleju@14: nikcleju@14: def bp_cvxopt(y,M,Omega): nikcleju@17: """ nikcleju@17: ABS-exact: Basis Pursuit (based cvxopt) nikcleju@17: """ nikcleju@14: N,n = Omega.shape nikcleju@14: D = numpy.linalg.pinv(Omega) nikcleju@14: U,S,Vt = numpy.linalg.svd(D) nikcleju@14: Aextra = Vt[-(N-n):,:] nikcleju@14: nikcleju@14: # Create aggregate problem nikcleju@14: Atilde = numpy.vstack((numpy.dot(M,D), Aextra)) nikcleju@14: ytilde = numpy.concatenate((y,numpy.zeros(N-n))) nikcleju@14: nikcleju@14: return numpy.dot(D , pyCSalgos.BP.cvxopt_lp.cvxopt_lp(ytilde, Atilde)) nikcleju@14: nikcleju@13: nikcleju@13: def ompeps(y,M,Omega,epsilon): nikcleju@17: """ nikcleju@17: ABS-exact: OMP with stopping criterion residual < epsilon nikcleju@17: """ nikcleju@13: nikcleju@13: N,n = Omega.shape nikcleju@13: D = numpy.linalg.pinv(Omega) nikcleju@13: U,S,Vt = numpy.linalg.svd(D) nikcleju@13: Aextra = Vt[-(N-n):,:] nikcleju@13: nikcleju@13: # Create aggregate problem nikcleju@13: Atilde = numpy.vstack((numpy.dot(M,D), Aextra)) nikcleju@13: ytilde = numpy.concatenate((y,numpy.zeros(N-n))) nikcleju@13: nikcleju@13: opts = dict() nikcleju@13: opts['stopCrit'] = 'mse' nikcleju@13: opts['stopTol'] = epsilon nikcleju@14: return numpy.dot(D , pyCSalgos.OMP.omp_QR.greed_omp_qr(ytilde,Atilde,Atilde.shape[1],opts)[0]) nikcleju@13: nikcleju@13: def ompk(y,M,Omega,k): nikcleju@17: """ nikcleju@17: ABS-exact: OMP with stopping criterion fixed number of atoms = k nikcleju@17: """ nikcleju@13: nikcleju@13: N,n = Omega.shape nikcleju@13: D = numpy.linalg.pinv(Omega) nikcleju@13: U,S,Vt = numpy.linalg.svd(D) nikcleju@13: Aextra = Vt[-(N-n):,:] nikcleju@13: nikcleju@13: # Create aggregate problem nikcleju@13: Atilde = numpy.vstack((numpy.dot(M,D), Aextra)) nikcleju@13: ytilde = numpy.concatenate((y,numpy.zeros(N-n))) nikcleju@13: nikcleju@13: opts = dict() nikcleju@13: opts['stopTol'] = k nikcleju@14: return numpy.dot(D , pyCSalgos.OMP.omp_QR.greed_omp_qr(ytilde,Atilde,Atilde.shape[1],opts)[0]) nikcleju@13: nikcleju@13: def sl0(y,M,Omega, sigma_min, sigma_decrease_factor=0.5, mu_0=2, L=3, true_s=None): nikcleju@17: """ nikcleju@17: ABS-exact: Smooth L0 (SL0) nikcleju@17: """ nikcleju@13: nikcleju@13: N,n = Omega.shape nikcleju@13: D = numpy.linalg.pinv(Omega) nikcleju@13: U,S,Vt = numpy.linalg.svd(D) nikcleju@13: Aextra = Vt[-(N-n):,:] nikcleju@13: nikcleju@13: # Create aggregate problem nikcleju@13: Atilde = numpy.vstack((numpy.dot(M,D), Aextra)) nikcleju@13: ytilde = numpy.concatenate((y,numpy.zeros(N-n))) nikcleju@13: nikcleju@13: return numpy.dot(D, pyCSalgos.SL0.SL0.SL0(Atilde,ytilde,sigma_min,sigma_decrease_factor,mu_0,L,true_s)) nikcleju@13: nikcleju@13: def tst_recom(y,M,Omega, nsweep=300, tol=0.00001, xinitial=None, ro=None): nikcleju@17: """ nikcleju@17: ABS-exact: Two Stage Thresholding (TST) with optimized parameters (see Maleki & Donoho) nikcleju@17: """ nikcleju@13: nikcleju@13: N,n = Omega.shape nikcleju@13: D = numpy.linalg.pinv(Omega) nikcleju@13: U,S,Vt = numpy.linalg.svd(D) nikcleju@13: Aextra = Vt[-(N-n):,:] nikcleju@13: nikcleju@13: # Create aggregate problem nikcleju@13: Atilde = numpy.vstack((numpy.dot(M,D), Aextra)) nikcleju@13: ytilde = numpy.concatenate((y,numpy.zeros(N-n))) nikcleju@13: nikcleju@14: return numpy.dot(D, pyCSalgos.TST.RecommendedTST.RecommendedTST(Atilde, ytilde, nsweep, tol, xinitial, ro)) nikcleju@13: