annotate tests/l1qc_test.py @ 68:cab8a215f9a1 tip

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