annotate tests/GAP_test.py @ 17:ef63b89b375a

Started working on GAP, but not complete
author nikcleju
date Sun, 06 Nov 2011 20:58:11 +0000
parents
children a8ff9a881d2f
rev   line source
nikcleju@17 1 # -*- coding: utf-8 -*-
nikcleju@17 2 """
nikcleju@17 3 Created on Sun Nov 06 20:53:14 2011
nikcleju@17 4
nikcleju@17 5 @author: Nic
nikcleju@17 6 """
nikcleju@17 7 import numpy as np
nikcleju@17 8 import numpy.linalg
nikcleju@17 9 import scipy.io
nikcleju@17 10 import unittest
nikcleju@17 11 from pyCSalgos.SL0.SL0_approx import SL0_approx
nikcleju@17 12
nikcleju@17 13 class SL0results(unittest.TestCase):
nikcleju@17 14 def testResults(self):
nikcleju@17 15 mdict = scipy.io.loadmat('SL0approxtestdata.mat')
nikcleju@17 16
nikcleju@17 17 # A = system matrix
nikcleju@17 18 # Y = matrix with measurements (on columns)
nikcleju@17 19 # sigmamin = vector with sigma_min
nikcleju@17 20 for A,Y,eps,sigmamin,Xr in zip(mdict['cellA'].squeeze(),mdict['cellY'].squeeze(),mdict['cellEps'].squeeze(),mdict['sigmamin'].squeeze(),mdict['cellXr'].squeeze()):
nikcleju@17 21 for i in np.arange(Y.shape[1]):
nikcleju@17 22
nikcleju@17 23 # Fix numpy error "LapackError: Parameter a has non-native byte order in lapack_lite.dgesdd"
nikcleju@17 24 A = A.newbyteorder('=')
nikcleju@17 25 Y = Y.newbyteorder('=')
nikcleju@17 26 eps = eps.newbyteorder('=')
nikcleju@17 27 sigmamin = sigmamin.newbyteorder('=')
nikcleju@17 28 Xr = Xr.newbyteorder('=')
nikcleju@17 29
nikcleju@17 30 xr = SL0_approx(A, Y[:,i], eps.squeeze()[i], sigmamin)
nikcleju@17 31
nikcleju@17 32 # check if found solution is the same as the correct cslution
nikcleju@17 33 diff = numpy.linalg.norm(xr - Xr[:,i])
nikcleju@17 34 self.assertTrue(diff < 1e-12)
nikcleju@17 35 # err1 = numpy.linalg.norm(Y[:,i] - np.dot(A,xr))
nikcleju@17 36 # err2 = numpy.linalg.norm(Y[:,i] - np.dot(A,Xr[:,i]))
nikcleju@17 37 # norm1 = numpy.linalg.norm(xr,1)
nikcleju@17 38 # norm2 = numpy.linalg.norm(Xr[:,i],1)
nikcleju@17 39 #
nikcleju@17 40 # # Make a more robust condition:
nikcleju@17 41 # # OK; if solutions are close enough (diff < 1e-6)
nikcleju@17 42 # # or
nikcleju@17 43 # # (
nikcleju@17 44 # # Python solution fulfills the constraint better (or up to 1e-6 worse)
nikcleju@17 45 # # and
nikcleju@17 46 # # Python solution has l1 norm no more than 1e-6 larger as the reference solution
nikcleju@17 47 # # (i.e. either norm1 < norm2 or norm1>norm2 not by more than 1e-6)
nikcleju@17 48 # # )
nikcleju@17 49 # #
nikcleju@17 50 # # ERROR: else
nikcleju@17 51 # differr = err1 - err2 # intentionately no abs(), since err1` < err2 is good
nikcleju@17 52 # diffnorm = norm1 - norm2 # intentionately no abs(), since norm1 < norm2 is good
nikcleju@17 53 # if diff < 1e-6 or (differr < 1e-6 and (diffnorm < 1e-6)):
nikcleju@17 54 # isok = True
nikcleju@17 55 # else:
nikcleju@17 56 # isok = False
nikcleju@17 57 # self.assertTrue(isok)
nikcleju@17 58
nikcleju@17 59 #diff = numpy.linalg.norm(xr - Xr[:,i])
nikcleju@17 60 #if diff > 1e-6:
nikcleju@17 61 # self.assertTrue(diff < 1e-6)
nikcleju@17 62
nikcleju@17 63
nikcleju@17 64 if __name__ == "__main__":
nikcleju@17 65 #import cProfile
nikcleju@17 66 #cProfile.run('unittest.main()', 'profres')
nikcleju@17 67 unittest.main()
nikcleju@17 68 #suite = unittest.TestLoader().loadTestsFromTestCase(CompareResults)
nikcleju@17 69 #unittest.TextTestRunner(verbosity=2).run(suite)