nikcleju@62: # -*- coding: utf-8 -*- nikcleju@62: """ nikcleju@62: Created on Fri Oct 21 14:28:08 2011 nikcleju@62: nikcleju@62: @author: Nic nikcleju@62: nikcleju@62: Test l1-magic l1eq_pd() algorithm nikcleju@62: """ nikcleju@62: nikcleju@62: import numpy as np nikcleju@62: import numpy.linalg nikcleju@62: import scipy.io nikcleju@62: import unittest nikcleju@62: from pyCSalgos.BP.l1eq_pd import l1eq_pd nikcleju@62: #from l1qc import l1qc_logbarrier nikcleju@62: nikcleju@62: class l1eq_results(unittest.TestCase): nikcleju@62: def testResults(self): nikcleju@62: mdict = scipy.io.loadmat('l1eq_testdata.mat') nikcleju@62: nikcleju@62: # A = system matrix nikcleju@62: # Y = matrix with measurements (on columns) nikcleju@62: # X0 = matrix with initial solutions (on columns) nikcleju@62: # Xr = matrix with correct solutions (on columns) nikcleju@62: for A,Y,X0,Xr in zip(mdict['cellA'].squeeze(),mdict['cellY'].squeeze(),mdict['X0'].squeeze(),mdict['Xr'].squeeze()): nikcleju@62: for i in np.arange(Y.shape[1]): nikcleju@62: xr = l1eq_pd(X0[:,i], A, np.array([]), Y[:,i]) nikcleju@62: nikcleju@62: # check if found solution is the same as the correct cslution nikcleju@62: diff = numpy.linalg.norm(xr - Xr[:,i]) nikcleju@62: err1 = numpy.linalg.norm(Y[:,i] - np.dot(A,xr)) nikcleju@62: err2 = numpy.linalg.norm(Y[:,i] - np.dot(A,Xr[:,i])) nikcleju@62: norm1 = numpy.linalg.norm(xr,1) nikcleju@62: norm2 = numpy.linalg.norm(Xr[:,i],1) nikcleju@62: print 'diff = ',diff nikcleju@62: print 'err1 = ',err1 nikcleju@62: print 'err2 = ',err2 nikcleju@62: print 'norm1 = ',norm1 nikcleju@62: print 'norm2 = ',norm2 nikcleju@62: nikcleju@62: # It seems Matlab's linsolve and scipy solve are slightly different nikcleju@62: # Therefore make a more robust condition: nikcleju@62: # OK; if solutions are close enough (diff < 1e-6) nikcleju@62: # or nikcleju@62: # ( nikcleju@62: # they fulfill the constraint close enough (differr < 1e-6) nikcleju@62: # and nikcleju@62: # Python solution has l1 norm no more than 1e-6 larger as the reference solution nikcleju@62: # (i.e. either norm1 < norm2 or norm1>norm2 not by more than 1e-6) nikcleju@62: # ) nikcleju@62: # nikcleju@62: # ERROR: else nikcleju@62: differr = abs((err1 - err2)) nikcleju@62: diffnorm = norm1 - norm2 # intentionately no abs(), since norm1 < norm2 is good nikcleju@62: if diff < 1e-6 or (differr < 1e-6 and (diffnorm < 1e-6)): nikcleju@62: isok = True nikcleju@62: else: nikcleju@62: isok = False nikcleju@62: nikcleju@62: #if not isok: nikcleju@62: # print "should raise" nikcleju@62: # #self.assertTrue(isok) nikcleju@62: self.assertTrue(isok) nikcleju@62: nikcleju@62: if __name__ == "__main__": nikcleju@62: unittest.main(verbosity=2) nikcleju@62: #suite = unittest.TestLoader().loadTestsFromTestCase(CompareResults) nikcleju@62: #unittest.TextTestRunner(verbosity=2).run(suite)