nikcleju@4: # -*- coding: utf-8 -*- nikcleju@4: """ nikcleju@4: Created on Mon Oct 24 21:17:49 2011 nikcleju@4: nikcleju@4: @author: Nic nikcleju@4: nikcleju@4: Test RecommendedTST algorithm nikcleju@5: u""" nikcleju@4: nikcleju@4: import numpy as np nikcleju@4: import numpy.linalg nikcleju@4: import scipy.io nikcleju@4: import unittest nikcleju@4: from pyCSalgos.RecomTST.RecommendedTST import RecommendedTST nikcleju@4: nikcleju@4: class RecomTSTresults(unittest.TestCase): nikcleju@4: def testResults(self): nikcleju@4: mdict = scipy.io.loadmat('RecomTSTtestdata.mat') nikcleju@4: nikcleju@4: # A = system matrix nikcleju@4: # Y = matrix with measurements (on columns) nikcleju@4: # X0 = matrix with initial solutions (on columns) nikcleju@4: # Eps = vector with epsilon nikcleju@4: # Xr = matrix with correct solutions (on columns) nikcleju@4: for A,Y,X0,Tol,Xr in zip(mdict['cellA'].squeeze(),mdict['cellY'].squeeze(),mdict['cellX0'].squeeze(),mdict['cellTol'].squeeze(),mdict['cellXr'].squeeze()): nikcleju@4: for i in np.arange(Y.shape[1]): nikcleju@4: xr = RecommendedTST(A, Y[:,i], nsweep=300, tol=Tol.squeeze()[i], xinitial=X0[:,i]) nikcleju@4: nikcleju@4: # check if found solution is the same as the correct cslution nikcleju@4: diff = numpy.linalg.norm(xr - Xr[:,i]) nikcleju@5: err1 = numpy.linalg.norm(Y[:,i] - np.dot(A,xr)) nikcleju@5: err2 = numpy.linalg.norm(Y[:,i] - np.dot(A,Xr[:,i])) nikcleju@5: norm1 = numpy.linalg.norm(xr,1) nikcleju@5: norm2 = numpy.linalg.norm(Xr[:,i],1) nikcleju@5: nikcleju@5: # Make a more robust condition: nikcleju@4: # OK; if solutions are close enough (diff < 1e-6) nikcleju@4: # or nikcleju@4: # ( nikcleju@5: # Python solution fulfills the constraint better (or up to 1e-6 worse) nikcleju@4: # and nikcleju@4: # Python solution has l1 norm no more than 1e-6 larger as the reference solution nikcleju@4: # (i.e. either norm1 < norm2 or norm1>norm2 not by more than 1e-6) nikcleju@4: # ) nikcleju@4: # nikcleju@5: # ERROR: else nikcleju@5: differr = err1 - err2 # intentionately no abs(), since err1` < err2 is good nikcleju@5: diffnorm = norm1 - norm2 # intentionately no abs(), since norm1 < norm2 is good nikcleju@5: if diff < 1e-6 or (differr < 1e-6 and (diffnorm < 1e-6)): nikcleju@5: isok = True nikcleju@5: else: nikcleju@5: isok = False nikcleju@5: self.assertTrue(isok) nikcleju@5: nikcleju@5: #diff = numpy.linalg.norm(xr - Xr[:,i]) nikcleju@5: #if diff > 1e-6: nikcleju@5: # self.assertTrue(diff < 1e-6) nikcleju@5: nikcleju@4: nikcleju@4: if __name__ == "__main__": nikcleju@7: #import cProfile nikcleju@7: #cProfile.run('unittest.main()', 'profres') nikcleju@7: unittest.main() nikcleju@4: #suite = unittest.TestLoader().loadTestsFromTestCase(CompareResults) nikcleju@7: #unittest.TextTestRunner(verbosity=2).run(suite)