@@ -110,16 +110,18 @@ def __init__(self):
110110 def osqp_settings (self ):
111111 """Map internal settings to OSQP settings."""
112112 settings = {
113- "linsys_solver " : "qdldl " ,
113+ "solver_type " : "direct " ,
114114 "max_iter" : self .settings ["iteration_limit" ],
115115 "eps_abs" : self .settings ["optimality_tolerance" ],
116116 "eps_rel" : self .settings ["optimality_tolerance" ],
117117 "eps_prim_inf" : self .settings ["primal_inf_tolerance" ],
118118 "eps_dual_inf" : self .settings ["dual_inf_tolerance" ],
119- "polish " : True ,
119+ "polishing " : True ,
120120 "verbose" : int (self .settings ["verbose" ] > 0 ),
121121 "scaling" : 10 if self .settings ["presolve" ] is True else 0 ,
122- "time_limit" : self .settings ["time_limit" ],
122+ "time_limit" : (
123+ self .settings ["time_limit" ] if self .settings ["time_limit" ] > 0 else 1e10
124+ ),
123125 "adaptive_rho" : True ,
124126 "rho" : 1.0 ,
125127 "alpha" : 1.6 ,
@@ -154,9 +156,15 @@ def solve_osqp(self):
154156 sp = self .build (add_variable_constraints = True )
155157 solver = osqp .OSQP ()
156158 log .debug ("Setting up OSQP problem." )
157- solver .setup (
158- P = sp .P , q = sp .q , A = sp .A , l = sp .bounds [:, 0 ], u = sp .bounds [:, 1 ], ** settings
159- )
159+ try :
160+ solver .setup (
161+ P = sp .P , q = sp .q , A = sp .A , l = sp .bounds [:, 0 ], u = sp .bounds [:, 1 ], ** settings
162+ )
163+ except osqp .interface .OSQPException as err :
164+ reason = "," .join (str (a ) for a in err .args )
165+ if len (err .args ) > 0 and err .args [0 ] == 4 :
166+ reason = "non-convex problem"
167+ raise ValueError (f"OSQP error: { reason } " )
160168 if self ._solution is not None :
161169 if self .still_valid (sp ):
162170 solver .warm_start (x = self ._solution ["x" ], y = self ._solution ["y" ])
@@ -244,9 +252,7 @@ def still_valid(self, problem):
244252 """Check if previous solutions is still feasible."""
245253 nv , nc = len (self .variables ), len (self .constraints )
246254 b = problem .bounds
247- if len (self ._solution ["x" ]) != nv or len (
248- self ._solution ["y" ]
249- ) != nc + nv :
255+ if len (self ._solution ["x" ]) != nv or len (self ._solution ["y" ]) != nc + nv :
250256 return False
251257 c = problem .A .dot (self ._solution ["x" ])
252258 tol = self .settings ["primal_inf_tolerance" ]
0 commit comments