embotech/ecos

ECOS Fails on Quad Program from OSQP Benchmark (LASSO)

Opened this issue · 1 comments

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.

a Bug posted to CVXPY project by SCS which seems to be valid for ECOS as well - cvxpy/cvxpy#1470.