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) |