annotate tests/l1eq_test.py @ 68:cab8a215f9a1 tip

Minor
author Nic Cleju <nikcleju@gmail.com>
date Tue, 09 Jul 2013 14:50:09 +0300
parents e684f76c1969
children
rev   line source
nikcleju@62 1 # -*- coding: utf-8 -*-
nikcleju@62 2 """
nikcleju@62 3 Created on Fri Oct 21 14:28:08 2011
nikcleju@62 4
nikcleju@62 5 @author: Nic
nikcleju@62 6
nikcleju@62 7 Test l1-magic l1eq_pd() algorithm
nikcleju@62 8 """
nikcleju@62 9
nikcleju@62 10 import numpy as np
nikcleju@62 11 import numpy.linalg
nikcleju@62 12 import scipy.io
nikcleju@62 13 import unittest
nikcleju@62 14 from pyCSalgos.BP.l1eq_pd import l1eq_pd
nikcleju@62 15 #from l1qc import l1qc_logbarrier
nikcleju@62 16
nikcleju@62 17 class l1eq_results(unittest.TestCase):
nikcleju@62 18 def testResults(self):
nikcleju@62 19 mdict = scipy.io.loadmat('l1eq_testdata.mat')
nikcleju@62 20
nikcleju@62 21 # A = system matrix
nikcleju@62 22 # Y = matrix with measurements (on columns)
nikcleju@62 23 # X0 = matrix with initial solutions (on columns)
nikcleju@62 24 # Xr = matrix with correct solutions (on columns)
nikcleju@62 25 for A,Y,X0,Xr in zip(mdict['cellA'].squeeze(),mdict['cellY'].squeeze(),mdict['X0'].squeeze(),mdict['Xr'].squeeze()):
nikcleju@62 26 for i in np.arange(Y.shape[1]):
nikcleju@62 27 xr = l1eq_pd(X0[:,i], A, np.array([]), Y[:,i])
nikcleju@62 28
nikcleju@62 29 # check if found solution is the same as the correct cslution
nikcleju@62 30 diff = numpy.linalg.norm(xr - Xr[:,i])
nikcleju@62 31 err1 = numpy.linalg.norm(Y[:,i] - np.dot(A,xr))
nikcleju@62 32 err2 = numpy.linalg.norm(Y[:,i] - np.dot(A,Xr[:,i]))
nikcleju@62 33 norm1 = numpy.linalg.norm(xr,1)
nikcleju@62 34 norm2 = numpy.linalg.norm(Xr[:,i],1)
nikcleju@62 35 print 'diff = ',diff
nikcleju@62 36 print 'err1 = ',err1
nikcleju@62 37 print 'err2 = ',err2
nikcleju@62 38 print 'norm1 = ',norm1
nikcleju@62 39 print 'norm2 = ',norm2
nikcleju@62 40
nikcleju@62 41 # It seems Matlab's linsolve and scipy solve are slightly different
nikcleju@62 42 # Therefore make a more robust condition:
nikcleju@62 43 # OK; if solutions are close enough (diff < 1e-6)
nikcleju@62 44 # or
nikcleju@62 45 # (
nikcleju@62 46 # they fulfill the constraint close enough (differr < 1e-6)
nikcleju@62 47 # and
nikcleju@62 48 # Python solution has l1 norm no more than 1e-6 larger as the reference solution
nikcleju@62 49 # (i.e. either norm1 < norm2 or norm1>norm2 not by more than 1e-6)
nikcleju@62 50 # )
nikcleju@62 51 #
nikcleju@62 52 # ERROR: else
nikcleju@62 53 differr = abs((err1 - err2))
nikcleju@62 54 diffnorm = norm1 - norm2 # intentionately no abs(), since norm1 < norm2 is good
nikcleju@62 55 if diff < 1e-6 or (differr < 1e-6 and (diffnorm < 1e-6)):
nikcleju@62 56 isok = True
nikcleju@62 57 else:
nikcleju@62 58 isok = False
nikcleju@62 59
nikcleju@62 60 #if not isok:
nikcleju@62 61 # print "should raise"
nikcleju@62 62 # #self.assertTrue(isok)
nikcleju@62 63 self.assertTrue(isok)
nikcleju@62 64
nikcleju@62 65 if __name__ == "__main__":
nikcleju@62 66 unittest.main(verbosity=2)
nikcleju@62 67 #suite = unittest.TestLoader().loadTestsFromTestCase(CompareResults)
nikcleju@62 68 #unittest.TextTestRunner(verbosity=2).run(suite)