nikcleju@15: # -*- coding: utf-8 -*- nikcleju@15: """ nikcleju@15: Created on Sat Nov 05 21:34:49 2011 nikcleju@15: nikcleju@15: @author: Nic nikcleju@15: """ nikcleju@15: import numpy as np nikcleju@15: import numpy.linalg nikcleju@15: import scipy.io nikcleju@15: import unittest nikcleju@15: from pyCSalgos.SL0.SL0_approx import SL0_approx nikcleju@15: nikcleju@15: class SL0results(unittest.TestCase): nikcleju@15: def testResults(self): nikcleju@15: mdict = scipy.io.loadmat('SL0approxtestdata.mat') nikcleju@15: nikcleju@15: # A = system matrix nikcleju@15: # Y = matrix with measurements (on columns) nikcleju@15: # sigmamin = vector with sigma_min nikcleju@15: for A,Y,eps,sigmamin,Xr in zip(mdict['cellA'].squeeze(),mdict['cellY'].squeeze(),mdict['cellEps'].squeeze(),mdict['sigmamin'].squeeze(),mdict['cellXr'].squeeze()): nikcleju@15: for i in np.arange(Y.shape[1]): nikcleju@15: nikcleju@15: # Fix numpy error "LapackError: Parameter a has non-native byte order in lapack_lite.dgesdd" nikcleju@15: A = A.newbyteorder('=') nikcleju@15: Y = Y.newbyteorder('=') nikcleju@15: eps = eps.newbyteorder('=') nikcleju@15: sigmamin = sigmamin.newbyteorder('=') nikcleju@15: Xr = Xr.newbyteorder('=') nikcleju@15: nikcleju@15: xr = SL0_approx(A, Y[:,i], eps.squeeze()[i], sigmamin) nikcleju@15: nikcleju@15: # check if found solution is the same as the correct cslution nikcleju@15: diff = numpy.linalg.norm(xr - Xr[:,i]) nikcleju@15: self.assertTrue(diff < 1e-12) nikcleju@15: # err1 = numpy.linalg.norm(Y[:,i] - np.dot(A,xr)) nikcleju@15: # err2 = numpy.linalg.norm(Y[:,i] - np.dot(A,Xr[:,i])) nikcleju@15: # norm1 = numpy.linalg.norm(xr,1) nikcleju@15: # norm2 = numpy.linalg.norm(Xr[:,i],1) nikcleju@15: # nikcleju@15: # # Make a more robust condition: nikcleju@15: # # OK; if solutions are close enough (diff < 1e-6) nikcleju@15: # # or nikcleju@15: # # ( nikcleju@15: # # Python solution fulfills the constraint better (or up to 1e-6 worse) nikcleju@15: # # and nikcleju@15: # # Python solution has l1 norm no more than 1e-6 larger as the reference solution nikcleju@15: # # (i.e. either norm1 < norm2 or norm1>norm2 not by more than 1e-6) nikcleju@15: # # ) nikcleju@15: # # nikcleju@15: # # ERROR: else nikcleju@15: # differr = err1 - err2 # intentionately no abs(), since err1` < err2 is good nikcleju@15: # diffnorm = norm1 - norm2 # intentionately no abs(), since norm1 < norm2 is good nikcleju@15: # if diff < 1e-6 or (differr < 1e-6 and (diffnorm < 1e-6)): nikcleju@15: # isok = True nikcleju@15: # else: nikcleju@15: # isok = False nikcleju@15: # self.assertTrue(isok) nikcleju@15: nikcleju@15: #diff = numpy.linalg.norm(xr - Xr[:,i]) nikcleju@15: #if diff > 1e-6: nikcleju@15: # self.assertTrue(diff < 1e-6) nikcleju@15: nikcleju@15: nikcleju@15: if __name__ == "__main__": nikcleju@15: #import cProfile nikcleju@15: #cProfile.run('unittest.main()', 'profres') nikcleju@15: unittest.main() nikcleju@15: #suite = unittest.TestLoader().loadTestsFromTestCase(CompareResults) nikcleju@15: #unittest.TextTestRunner(verbosity=2).run(suite)