nikcleju@10
|
1 # -*- coding: utf-8 -*-
|
nikcleju@10
|
2 """
|
nikcleju@17
|
3 Algorithms for approximate analysis recovery based on synthesis solvers (a.k.a. Analysis by Synthesis, ABS).
|
nikcleju@17
|
4 Approximate reconstruction, ABS-lambda.
|
nikcleju@10
|
5
|
nikcleju@17
|
6 Author: Nicolae Cleju
|
nikcleju@10
|
7 """
|
nikcleju@17
|
8 __author__ = "Nicolae Cleju"
|
nikcleju@17
|
9 __license__ = "GPL"
|
nikcleju@17
|
10 __email__ = "nikcleju@gmail.com"
|
nikcleju@17
|
11
|
nikcleju@10
|
12
|
nikcleju@10
|
13 import numpy
|
nikcleju@17
|
14
|
nikcleju@17
|
15 # Import synthesis solvers from pyCSalgos package
|
nikcleju@10
|
16 import pyCSalgos.BP.l1qc
|
nikcleju@13
|
17 import pyCSalgos.SL0.SL0_approx
|
nikcleju@10
|
18 import pyCSalgos.OMP.omp_QR
|
nikcleju@10
|
19 import pyCSalgos.TST.RecommendedTST
|
nikcleju@10
|
20
|
nikcleju@10
|
21 def sl0(y,M,Omega,epsilon,lbd,sigma_min, sigma_decrease_factor=0.5, mu_0=2, L=3, A_pinv=None, true_s=None):
|
nikcleju@17
|
22 """
|
nikcleju@17
|
23 ABS-lambda: Smooth L0 (SL0)
|
nikcleju@17
|
24 """
|
nikcleju@10
|
25 N,n = Omega.shape
|
nikcleju@10
|
26 D = numpy.linalg.pinv(Omega)
|
nikcleju@10
|
27 U,S,Vt = numpy.linalg.svd(D)
|
nikcleju@10
|
28 aggDupper = numpy.dot(M,D)
|
nikcleju@10
|
29 aggDlower = Vt[-(N-n):,:]
|
nikcleju@13
|
30 aggD = numpy.vstack((aggDupper, lbd * aggDlower))
|
nikcleju@10
|
31 aggy = numpy.concatenate((y, numpy.zeros(N-n)))
|
nikcleju@10
|
32
|
nikcleju@21
|
33 #return numpy.dot(D, pyCSalgos.SL0.SL0_approx.SL0_approx(aggD,aggy,epsilon,sigma_min,sigma_decrease_factor,mu_0,L,A_pinv,true_s))
|
nikcleju@21
|
34 return numpy.dot(D, pyCSalgos.SL0.SL0_approx.SL0_approx_dai(aggD,aggy,epsilon,sigma_min,sigma_decrease_factor,mu_0,L,A_pinv,true_s))
|
nikcleju@10
|
35
|
nikcleju@13
|
36 def bp(y,M,Omega,epsilon,lbd, x0, lbtol=1e-3, mu=10, cgtol=1e-8, cgmaxiter=200, verbose=False):
|
nikcleju@17
|
37 """
|
nikcleju@17
|
38 ABS-lambda: Basis Pursuit (based on l1magic toolbox)
|
nikcleju@17
|
39 """
|
nikcleju@10
|
40 N,n = Omega.shape
|
nikcleju@10
|
41 D = numpy.linalg.pinv(Omega)
|
nikcleju@10
|
42 U,S,Vt = numpy.linalg.svd(D)
|
nikcleju@10
|
43 aggDupper = numpy.dot(M,D)
|
nikcleju@10
|
44 aggDlower = Vt[-(N-n):,:]
|
nikcleju@13
|
45 aggD = numpy.vstack((aggDupper, lbd * aggDlower))
|
nikcleju@10
|
46 aggy = numpy.concatenate((y, numpy.zeros(N-n)))
|
nikcleju@10
|
47
|
nikcleju@16
|
48 return numpy.dot(D, pyCSalgos.BP.l1qc.l1qc_logbarrier(x0,aggD,aggD.T,aggy,epsilon, lbtol, mu, cgtol, cgmaxiter, verbose))
|
nikcleju@10
|
49
|
nikcleju@10
|
50 def ompeps(y,M,Omega,epsilon,lbd):
|
nikcleju@17
|
51 """
|
nikcleju@17
|
52 ABS-lambda: OMP with stopping criterion residual < epsilon
|
nikcleju@17
|
53 """
|
nikcleju@10
|
54 N,n = Omega.shape
|
nikcleju@10
|
55 D = numpy.linalg.pinv(Omega)
|
nikcleju@10
|
56 U,S,Vt = numpy.linalg.svd(D)
|
nikcleju@10
|
57 aggDupper = numpy.dot(M,D)
|
nikcleju@10
|
58 aggDlower = Vt[-(N-n):,:]
|
nikcleju@21
|
59 aggD = numpy.vstack((aggDupper, lbd * aggDlower))
|
nikcleju@10
|
60 aggy = numpy.concatenate((y, numpy.zeros(N-n)))
|
nikcleju@10
|
61
|
nikcleju@10
|
62 opts = dict()
|
nikcleju@10
|
63 opts['stopCrit'] = 'mse'
|
nikcleju@10
|
64 opts['stopTol'] = epsilon**2 / aggy.size
|
nikcleju@16
|
65 return numpy.dot(D, pyCSalgos.OMP.omp_QR.greed_omp_qr(aggy,aggD,aggD.shape[1],opts)[0])
|
nikcleju@10
|
66
|
nikcleju@10
|
67 def tst_recom(y,M,Omega,epsilon,lbd, nsweep=300, xinitial=None, ro=None):
|
nikcleju@17
|
68 """
|
nikcleju@17
|
69 ABS-lambda: Two Stage Thresholding (TST) with optimized parameters (see Maleki & Donoho)
|
nikcleju@17
|
70 """
|
nikcleju@10
|
71 N,n = Omega.shape
|
nikcleju@10
|
72 D = numpy.linalg.pinv(Omega)
|
nikcleju@10
|
73 U,S,Vt = numpy.linalg.svd(D)
|
nikcleju@10
|
74 aggDupper = numpy.dot(M,D)
|
nikcleju@10
|
75 aggDlower = Vt[-(N-n):,:]
|
nikcleju@13
|
76 aggD = numpy.vstack((aggDupper, lbd * aggDlower))
|
nikcleju@10
|
77 aggy = numpy.concatenate((y, numpy.zeros(N-n)))
|
nikcleju@10
|
78
|
nikcleju@10
|
79 tol = epsilon / numpy.linalg.norm(aggy)
|
nikcleju@21
|
80 return numpy.dot(D, pyCSalgos.TST.RecommendedTST.RecommendedTST(aggD, aggy, nsweep, tol, xinitial, ro))
|
nikcleju@10
|
81 |