ECOS Fails on Quad Program from OSQP Benchmark (LASSO)
Opened this issue · 1 comments
RoyiAvital commented
Specifications
- OS: Windows 10
- ECOS Version:
2.0.7.post1
(Python PIP) - Compiler: Python
Description
I have a pretty simple Quad Program which ECOS fails to solve (Returns nan
) while Gurobi / OSQP manages to solver it.
I am using CVXPY
to utilize ECOS
.
How to reproduce
Python code to reproduce:
# General tools
import numpy as np
import scipy as sp
# Sparse
import scipy.sparse as spa
# Solvers
import cvxpy
# Code from OSQP Benchmark
class LassoExample(object):
'''
Lasso QP example
'''
def __init__(self, n, seed=1):
# Set random seed
np.random.seed(seed)
self.n = int(n) # Number of features
self.m = int(self.n * 10) # Number of data-points
self.Ad = spa.random(self.m, self.n, density=0.15,
data_rvs=np.random.randn)
self.x_true = np.multiply((np.random.rand(self.n) >
0.5).astype(float),
np.random.randn(self.n)) / np.sqrt(self.n)
self.bd = self.Ad.dot(self.x_true) + np.random.randn(self.m)
self.lambda_max = np.linalg.norm(self.Ad.T.dot(self.bd), np.inf)
self.lambda_param = (1./5.) * self.lambda_max
self.qp_problem = self._generate_qp_problem()
def _generate_qp_problem(self):
# Construct the problem
# minimize y' * y + lambda * 1' * t
# subject to y = Ax - b
# -t <= x <= t
P = spa.block_diag((spa.csc_matrix((self.n, self.n)), 2*spa.eye(self.m), spa.csc_matrix((self.n, self.n))), format='csc')
q = np.append(np.zeros(self.m + self.n), self.lambda_param * np.ones(self.n))
In = spa.eye(self.n)
Onm = spa.csc_matrix((self.n, self.m))
A = spa.vstack([spa.hstack([self.Ad, -spa.eye(self.m),
spa.csc_matrix((self.m, self.n))]),
spa.hstack([In, Onm, -In]),
spa.hstack([In, Onm, In])]).tocsc()
l = np.hstack([self.bd, -np.inf * np.ones(self.n), np.zeros(self.n)])
u = np.hstack([self.bd, np.zeros(self.n), np.inf * np.ones(self.n)])
return P, q, A, l, u, A.shape[0], A.shape[1]
lassoQp = LassoExample(3);
P, q, A, l, u, m, n = lassoQp._generate_qp_problem();
x = cvxpy.Variable(lassoQp.n + lassoQp.m + lassoQp.n);
cvxObj = cvxpy.Minimize(cvxpy.quad_form(x, P) + (x @ q));
cvxCons = [l <= A @ x, A @ x <= u];
cvxPrblm = cvxpy.Problem(cvxObj, cvxCons);
cvxRes = cvxPrblm.solve(solver = cvxpy.ECOS, verbose = True);
I am also attaching as a .txt
file SCSFail.txt (Change solver into ECOS
).
Additional information
It is a LASSO problem converted into QP.
Actually SCS fails other problems from OSQP Benchmark such as: Huber Fitting, SVM.
Running the same problems with OSQP or Gurobi yields a valid solution.
Output
===============================================================================
CVXPY
v1.1.15
===============================================================================
(CVXPY) Aug 24 04:04:35 PM: Your problem has 36 variables, 2 constraints, and 0 parameters.
(CVXPY) Aug 24 04:04:35 PM: It is compliant with the following grammars: DCP, DQCP
(CVXPY) Aug 24 04:04:35 PM: (If you need to solve this problem multiple times, but with different data, consider using parameters.)
(CVXPY) Aug 24 04:04:35 PM: CVXPY will first compile your problem; then, it will invoke a numerical solver to obtain a solution.
-------------------------------------------------------------------------------
Compilation
-------------------------------------------------------------------------------
(CVXPY) Aug 24 04:04:35 PM: Compiling problem (target solver=ECOS).
(CVXPY) Aug 24 04:04:35 PM: Reduction chain: Dcp2Cone -> CvxAttr2Constr -> ConeMatrixStuffing -> ECOS
(CVXPY) Aug 24 04:04:35 PM: Applying reduction Dcp2Cone
(CVXPY) Aug 24 04:04:35 PM: Applying reduction CvxAttr2Constr
(CVXPY) Aug 24 04:04:35 PM: Applying reduction ConeMatrixStuffing
(CVXPY) Aug 24 04:04:35 PM: Applying reduction ECOS
(CVXPY) Aug 24 04:04:35 PM: Finished problem compilation (took 2.301e-02 seconds).
-------------------------------------------------------------------------------
Numerical solver
-------------------------------------------------------------------------------
(CVXPY) Aug 24 04:04:35 PM: Invoking solver ECOS to obtain a solution.
ECOS 2.0.7 - (C) embotech GmbH, Zurich Switzerland, 2012-15. Web: www.embotech.com/ECOS
It pcost dcost gap pres dres k/t mu step sigma IR | BT
0 -nan(ind) -inf +nan 0e+00 4e-03 1e+00 nan --- --- 0 1 - | - -
1 -nan(ind) +nan -nan(ind) -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
2 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
3 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
4 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
5 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
6 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
7 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
8 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
9 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
10 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
11 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
12 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
13 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
14 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
15 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
16 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
17 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
18 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
19 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
20 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
21 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
22 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
23 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
24 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
25 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
26 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
27 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
28 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
29 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
30 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
31 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
32 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
33 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
34 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
35 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
36 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
37 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
38 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
39 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
40 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
41 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
42 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
43 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
44 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
45 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
46 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
47 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
48 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
49 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
50 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
51 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
52 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
53 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
54 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
55 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
56 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
57 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
58 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
59 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
60 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
61 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
62 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
63 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
64 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
65 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
66 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
67 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
68 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
69 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
70 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
71 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
72 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
73 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
74 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
75 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
76 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
77 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
78 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
79 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
80 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
81 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
82 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
83 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
84 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
85 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
86 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
87 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
88 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
89 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
90 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
91 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
92 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
93 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
94 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
95 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
96 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
97 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
98 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
99 -nan(ind) +nan +nan -nan(ind) -nan(ind) nan -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
100 -nan(ind) +nan +nan -nan(ind) -nan(ind) -nan(ind) -nan(ind) 0.9890 1e-04 0 0 0 | 0 0
Maximum number of iterations reached, recovering best iterate (0) and stopping.
RAN OUT OF ITERATIONS (reached feastol=4.1e-03, reltol=-nan(ind), abstol=nan).
Runtime: 0.002965 seconds.
RoyiAvital commented
a Bug posted to CVXPY project by SCS which seems to be valid for ECOS as well - cvxpy/cvxpy#1470.