Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ECOS Fails on Quad Program from OSQP Benchmark (LASSO) #200

Open
RoyiAvital opened this issue Aug 24, 2021 · 1 comment
Open

ECOS Fails on Quad Program from OSQP Benchmark (LASSO) #200

RoyiAvital opened this issue Aug 24, 2021 · 1 comment

Comments

@RoyiAvital
Copy link

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
Copy link
Author

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant