annotate tests/NESTA_test.py @ 68:cab8a215f9a1 tip

Minor
author Nic Cleju <nikcleju@gmail.com>
date Tue, 09 Jul 2013 14:50:09 +0300
parents e6a5f2173015
children
rev   line source
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)