nikcleju@47
|
1 # -*- coding: utf-8 -*-
|
nikcleju@47
|
2 """
|
nikcleju@47
|
3 Created on Sun Nov 06 20:53:14 2011
|
nikcleju@47
|
4
|
nikcleju@47
|
5 @author: Nic
|
nikcleju@47
|
6 """
|
nikcleju@47
|
7 import numpy as np
|
nikcleju@47
|
8 import numpy.linalg
|
nikcleju@47
|
9 import scipy.io
|
nikcleju@47
|
10 import unittest
|
nikcleju@47
|
11 from pyCSalgos.NESTA.NESTA import NESTA
|
nikcleju@47
|
12
|
nikcleju@47
|
13 class NESTAresults(unittest.TestCase):
|
nikcleju@47
|
14 def testResults(self):
|
nikcleju@47
|
15 mdict = scipy.io.loadmat('NESTAtestdata.mat')
|
nikcleju@47
|
16
|
nikcleju@47
|
17 # Add [0,0] indices because data is read from mat file as [1,1] arrays
|
nikcleju@47
|
18 opt_TolVar = mdict['opt_TolVar'][0,0]
|
nikcleju@47
|
19 opt_Verbose = mdict['opt_Verbose'][0,0]
|
nikcleju@47
|
20 opt_muf = mdict['opt_muf'][0,0]
|
nikcleju@47
|
21 numA = mdict['numA'][0,0]
|
nikcleju@47
|
22
|
nikcleju@47
|
23 # Known bad but good:
|
nikcleju@47
|
24 known = ()
|
nikcleju@47
|
25
|
nikcleju@47
|
26 sumplus = 0.0
|
nikcleju@47
|
27 summinus = 0.0
|
nikcleju@47
|
28 numplus = 0
|
nikcleju@47
|
29 numminus = 0
|
nikcleju@47
|
30
|
nikcleju@47
|
31 # A = system matrix
|
nikcleju@47
|
32 # Y = matrix with measurements (on columns)
|
nikcleju@47
|
33 # sigmamin = vector with sigma_mincell
|
nikcleju@47
|
34 for k,A,Y,M,eps,Xr in zip(np.arange(numA),mdict['cellA'].squeeze(),mdict['cellY'].squeeze(),mdict['cellM'].squeeze(),mdict['cellEps'].squeeze(),mdict['cellXr'].squeeze()):
|
nikcleju@47
|
35
|
nikcleju@47
|
36 # Fix numpy error "LapackError: Parameter a has non-native byte order in lapack_lite.dgesdd"
|
nikcleju@47
|
37 A = A.newbyteorder('=')
|
nikcleju@47
|
38 Y = Y.newbyteorder('=')
|
nikcleju@47
|
39 M = M.newbyteorder('=')
|
nikcleju@47
|
40 eps = eps.newbyteorder('=')
|
nikcleju@47
|
41 Xr = Xr.newbyteorder('=')
|
nikcleju@47
|
42
|
nikcleju@47
|
43 eps = eps.squeeze()
|
nikcleju@47
|
44
|
nikcleju@47
|
45 U,S,V = numpy.linalg.svd(M, full_matrices = True)
|
nikcleju@47
|
46 V = V.T # Make like Matlab
|
nikcleju@47
|
47 m,n = M.shape # Make like Matlab
|
nikcleju@47
|
48 S = numpy.hstack((numpy.diag(S), numpy.zeros((m,n-m))))
|
nikcleju@47
|
49
|
nikcleju@47
|
50 optsUSV = {'U':U, 'S':S, 'V':V}
|
nikcleju@47
|
51 opts = {'U':A, 'Ut':A.T.copy(), 'USV':optsUSV, 'TolVar':opt_TolVar, 'Verbose':opt_Verbose}
|
nikcleju@47
|
52
|
nikcleju@47
|
53 for i in np.arange(Y.shape[1]):
|
nikcleju@47
|
54 xr = NESTA(M, None, Y[:,i], opt_muf, eps[i] * numpy.linalg.norm(Y[:,i]), opts)[0]
|
nikcleju@47
|
55
|
nikcleju@47
|
56 # check if found solution is the same as the correct cslution
|
nikcleju@47
|
57 diff = numpy.linalg.norm(xr - Xr[:,i])
|
nikcleju@47
|
58 print "k =",k,"i = ",i
|
nikcleju@47
|
59 if diff < 1e-6:
|
nikcleju@47
|
60 print "Recovery OK"
|
nikcleju@47
|
61 isOK = True
|
nikcleju@47
|
62 else:
|
nikcleju@47
|
63 if numpy.linalg.norm(xr,1) < numpy.linalg.norm(Xr[:,i],1):
|
nikcleju@47
|
64 numplus = numplus+1
|
nikcleju@47
|
65 sumplus = sumplus + numpy.linalg.norm(Xr[:,i],1) - numpy.linalg.norm(xr,1)
|
nikcleju@47
|
66 else:
|
nikcleju@47
|
67 numminus = numminus+1
|
nikcleju@47
|
68 summinus = summinus + numpy.linalg.norm(xr,1) - numpy.linalg.norm(Xr[:,i],1)
|
nikcleju@47
|
69
|
nikcleju@47
|
70 print "Oops"
|
nikcleju@47
|
71 if (k,i) not in known:
|
nikcleju@47
|
72 #isOK = False
|
nikcleju@47
|
73 print "Should stop here"
|
nikcleju@47
|
74 else:
|
nikcleju@47
|
75 print "Known bad but good"
|
nikcleju@47
|
76 isOK = True
|
nikcleju@47
|
77 # comment / uncomment this
|
nikcleju@47
|
78 self.assertTrue(isOK)
|
nikcleju@47
|
79 print 'Finished test'
|
nikcleju@47
|
80
|
nikcleju@47
|
81 if __name__ == "__main__":
|
nikcleju@47
|
82 #import cProfile
|
nikcleju@47
|
83 #cProfile.run('unittest.main()', 'profres')
|
nikcleju@47
|
84 unittest.main()
|
nikcleju@47
|
85 #suite = unittest.TestLoader().loadTestsFromTestCase(CompareResults)
|
nikcleju@47
|
86 #unittest.TextTestRunner(verbosity=2).run(suite)
|