changeset 65:3d53309236c4

Added cvxopt_lp.py. Some bugfixes in gap.py and l1eq_pd.py
author Nic Cleju <nikcleju@gmail.com>
date Fri, 16 Mar 2012 13:35:47 +0200
parents a115c982a0fd
children ee10ffb60428
files pyCSalgos/BP/cvxopt_lp.py pyCSalgos/BP/l1eq_pd.py pyCSalgos/GAP/GAP.py
diffstat 3 files changed, 49 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pyCSalgos/BP/cvxopt_lp.py	Fri Mar 16 13:35:47 2012 +0200
@@ -0,0 +1,41 @@
+
+import numpy
+import cvxopt
+import cvxopt.solvers
+import cvxopt.msk
+import mosek
+
+def cvxopt_lp(y, A):
+
+    N = A.shape[1]
+    AA = numpy.hstack((A, -A))
+    c = numpy.ones((2*N, 1))
+    
+    G = numpy.vstack((numpy.zeros((2*N,2*N)), -numpy.eye(2*N)))
+    h = numpy.zeros((4*N,1))
+
+    # Convert numpy arrays to cvxopt matrices
+    cvx_c = cvxopt.matrix(c)
+    cvx_G = cvxopt.matrix(G)
+    cvx_h = cvxopt.matrix(h)
+    cvx_AA = cvxopt.matrix(AA)
+    cvx_y = cvxopt.matrix(y.reshape(y.size,1))
+    
+    # Options    
+    cvxopt.solvers.options['show_progress'] = False
+    #cvxopt.solvers.options['MOSEK'] = {mosek.iparam.log: 0}
+    
+    # Solve
+    #res = cvxopt.solvers.lp(cvx_c, cvx_G, cvx_h, A=cvx_AA, b=cvx_y, solver='mosek')
+    res = cvxopt.solvers.lp(cvx_c, cvx_G, cvx_h, A=cvx_AA, b=cvx_y)
+      
+    primal = numpy.squeeze(numpy.array(res['x']))
+    gamma = primal[:N] - primal[N:]
+    return gamma
+    
+    #lb = zeros(2*N,1);
+    #ub = Inf*ones(2*N,1);
+    ##[primal,obj,exitflag,output2,dual] = linprog(c,[],[],A,y,lb,ub,[],opt);
+    ##[primal,~,~,~,~] = linprog(c,[],[],A,aggy,lb,ub);
+    #[primal,obj,exitflag,output2,dual] = linprog(c,[],[],A,aggy,lb,ub);
+    #gamma = primal(1:N) - primal((N+1):(2*N));
\ No newline at end of file
--- a/pyCSalgos/BP/l1eq_pd.py	Tue Mar 13 16:18:11 2012 +0200
+++ b/pyCSalgos/BP/l1eq_pd.py	Fri Mar 16 13:35:47 2012 +0200
@@ -221,6 +221,11 @@
     # End of original Matab code
     #----------------------------    
     
+    # Nic: check if b is 0; if so, return 0
+    #    Otherwise it will break later
+    if numpy.linalg.norm(b) < 1e-16:
+        return numpy.zeros_like(x0)
+    
     #largescale = isa(A,'function_handle');
     if hasattr(A, '__call__'):
         largescale = True
@@ -257,7 +262,7 @@
         #x0 = A'*w;
         try:
             w = scipy.linalg.solve(numpy.dot(A,A.T), b, sym_pos=True)
-            hcond = 1.0/numpy.linalg.cond(np.dot(A,A.T))
+            hcond = 1.0/numpy.linalg.cond(numpy.dot(A,A.T))
         except scipy.linalg.LinAlgError:
             if verbose:
               print 'A*At is ill-conditioned: cannot find starting point'
--- a/pyCSalgos/GAP/GAP.py	Tue Mar 13 16:18:11 2012 +0200
+++ b/pyCSalgos/GAP/GAP.py	Fri Mar 16 13:35:47 2012 +0200
@@ -55,7 +55,8 @@
     #if strcmp(params.l2solver, 'pseudoinverse')
     if params['l2solver'] == 'pseudoinverse':
     #if strcmp(class(M), 'double') && strcmp(class(Omega), 'double')
-      if M.dtype == 'float64' and Omega.dtype == 'double':
+      #if M.dtype == 'float64' and Omega.dtype == 'double':
+      if 1:
         while True:
             alpha = math.sqrt(lagmult);
             xhat = numpy.linalg.lstsq(numpy.concatenate((M, alpha*Omega[Lambdahat,:])), numpy.concatenate((y, numpy.zeros(Lambdahat.size))))[0]