Mercurial > hg > pycsalgos
view tests/sl0_test.py @ 18:a8ff9a881d2f
GAP test almost working. For some data the results are not the same because of representation error, so the test doesn't fully work for now. But the results seem to be accurate.
author | nikcleju |
---|---|
date | Mon, 07 Nov 2011 17:48:05 +0000 |
parents | edb5a287e0bb |
children |
line wrap: on
line source
# -*- coding: utf-8 -*- """ Created on Sat Nov 05 20:29:02 2011 Test SL0 algorithm @author: Nic """ import numpy as np import numpy.linalg import scipy.io import unittest from pyCSalgos.SL0.SL0 import SL0 class SL0results(unittest.TestCase): def testResults(self): mdict = scipy.io.loadmat('SL0testdata.mat') # A = system matrix # Y = matrix with measurements (on columns) # sigmamin = vector with sigma_min for A,Y,sigmamin,Xr in zip(mdict['cellA'].squeeze(),mdict['cellY'].squeeze(),mdict['sigmamin'].squeeze(),mdict['cellXr'].squeeze()): for i in np.arange(Y.shape[1]): # Fix numpy error "LapackError: Parameter a has non-native byte order in lapack_lite.dgesdd" A = A.newbyteorder('=') Y = Y.newbyteorder('=') sigmamin = sigmamin.newbyteorder('=') Xr = Xr.newbyteorder('=') xr = SL0(A, Y[:,i], sigmamin) # check if found solution is the same as the correct cslution diff = numpy.linalg.norm(xr - Xr[:,i]) self.assertTrue(diff < 1e-12) # err1 = numpy.linalg.norm(Y[:,i] - np.dot(A,xr)) # err2 = numpy.linalg.norm(Y[:,i] - np.dot(A,Xr[:,i])) # norm1 = numpy.linalg.norm(xr,1) # norm2 = numpy.linalg.norm(Xr[:,i],1) # # # Make a more robust condition: # # OK; if solutions are close enough (diff < 1e-6) # # or # # ( # # Python solution fulfills the constraint better (or up to 1e-6 worse) # # and # # Python solution has l1 norm no more than 1e-6 larger as the reference solution # # (i.e. either norm1 < norm2 or norm1>norm2 not by more than 1e-6) # # ) # # # # ERROR: else # differr = err1 - err2 # intentionately no abs(), since err1` < err2 is good # diffnorm = norm1 - norm2 # intentionately no abs(), since norm1 < norm2 is good # if diff < 1e-6 or (differr < 1e-6 and (diffnorm < 1e-6)): # isok = True # else: # isok = False # self.assertTrue(isok) #diff = numpy.linalg.norm(xr - Xr[:,i]) #if diff > 1e-6: # self.assertTrue(diff < 1e-6) if __name__ == "__main__": #import cProfile #cProfile.run('unittest.main()', 'profres') unittest.main() #suite = unittest.TestLoader().loadTestsFromTestCase(CompareResults) #unittest.TextTestRunner(verbosity=2).run(suite)