annotate tests/sl0_test.py @ 68:cab8a215f9a1 tip

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