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

Segmentation fault on simple problem #152

Open
Skiski opened this issue Jul 22, 2024 · 0 comments
Open

Segmentation fault on simple problem #152

Skiski opened this issue Jul 22, 2024 · 0 comments

Comments

@Skiski
Copy link

Skiski commented Jul 22, 2024

Hi,

I'm trying to use OSQP to solve some least-squares problems . I've adapted your example and it works great with one of my problems, but with the second one, I've got a segmentation fault.

Here is my file:

import osqp
import numpy as np
from scipy import sparse

# Define problem data
#                        0  1  2  3  4  5  6
A1 = sparse.csc_matrix([[0, 1, 0, 0, 1, 0, 0], #c12
                        [1, 0, 1, 0, 0, 1, 1], #c13
                        [1, 1, 1, 0, 1, 1, 1], #c23
                        [1, 1, 1, 1, 0, 0, 0], #maths
                        [0, 1, 0, 0, 1, 0, 0], #spc
                        [0, 0, 0, -1, 1, 1, 1] #svt
                       ])

#                        0  1  2  3  4  5  6
A2 = sparse.csc_matrix([[1, 0, 0, 0, 0, 0, 0],
                        [0, 1, 0, 0, 0, 0, 0],
                        [0, 0, 1, 0, 0, 0, 0],
                        [0, 0, 0, 1, 0, 0, 0],
                        [0, 0, 0, 0, 1, 0, 0],
                        [0, 0, 0, 0, 0, 1, 0],
                        [0, 0, 0, 0, 0, 0, 1],
                        [0, 1, 1, 0, 0, 0, 0],
                        [0, 0, 0, 0, 1, 1, 0]
                       ])

vmax = [13, 24, 24, 8, 15, 15, 1,
    24, 15
    ]

objectifs = [21, 12, 33, 27, 19, 3.5]

m = len(objectifs)
n = len(vmax)
vmin = [0] * n

l = np.array(objectifs+vmin)
u = np.array(objectifs+vmax)


P = sparse.block_diag([sparse.csc_matrix((n, n)), sparse.eye(m)], format='csc')
q = np.zeros(n+m)
A = sparse.bmat([
                 [A1, -sparse.eye(m)],
                 [A2,  None],
                 ], format='csc')


# Create an OSQP object
prob = osqp.OSQP()

# Setup workspace and change alpha parameter
prob.setup(P, q, A, l, u, verbose=False)

# Solve problem
res = prob.solve()

It crashes during the setup. If I remove the last two lines of A2, and the last two values of vmax, it works. If I add any of the two lines or any line with multiple 1 ot -1, it crashes.

Here is a similar problem that works:

import osqp
import numpy as np
from scipy import sparse

#                        a  b  c  d  e  f  g  h  i
A1 = sparse.csc_matrix([[0, 0, 0, 0, 0, 1, 0, 1, 0], #c12
                        [1, 1, 1, 1, 0, 0, 1, 0, 1], #c13
                        [-1, -1, -1, -1, 0, -1, -1, -1, -1], #c23
                        [1, 1, 1, 0, 0, 0, 1, 0, 0], #maths
                        [0, 0, 0, 0, 0, 1, 0, 1, 0], #spc
                        [0, 0, 1, 1, -1, 0, 0, 0, 1] #svt
                       ])

m, n = A1.shape

constantes = np.array([40, 5, 64, 16, 1, 9])

effectifs_attendus = np.array([54.5, 27.25, 27.25, 31, 20, 13.5])

objectifs = effectifs_attendus - constantes

vmin = np.array([0] * len(vmax))

#                        a  b  c  d  e  f  g  h  i
A2 = sparse.csc_matrix([[1, 0, 0, 0, 0, 0, 0, 0, 0],
                        [0, 1, 0, 0, 0, 0, 0, 0, 0],
                        [0, 0, 1, 0, 0, 0, 0, 0, 0],
                        [0, 0, 0, 1, 0, 0, 0, 0, 0],
                        [0, 0, 0, 0, 1, 0, 0, 0, 0],
                        [0, 0, 0, 0, 0, 1, 0, 0, 0],
                        [0, 0, 0, 0, 0, 0, 1, 0, 0],
                        [0, 0, 0, 0, 0, 0, 0, 1, 0],
                        [0, 0, 0, 0, 0, 0, 0, 0, 1],
                        [0, 0, 0, 0, 0, 1, 1, 0, 0],
                        [0, 0, 0, 0, 0, 0, 0, 1, 1]
                       ])

l = np.concatenate((objectifs, vmin), axis=None)
u = np.concatenate((objectifs, vmax), axis=None)

P = sparse.block_diag([sparse.csc_matrix((n, n)), sparse.eye(m)], format='csc')

q = np.zeros(n+m)

A = sparse.bmat([
    [A1, -sparse.eye(m)],
    [A2,  None],
    ], format='csc')

prob = osqp.OSQP()
prob.setup(P, q, A, l, u, verbose=0)
res = prob.solve()

I've installed osqp-python with pip.

I've used solve_ls from qpsolvers with the OSQP solver with the same problem, and it worked. Here is the program I used:

from numpy import array
from qpsolvers import solve_ls
from scipy import sparse
import time

#R = array([[1., 2., 0.], [-8., 3., 2.], [0., 1., 1.]])
R = sparse.csc_matrix([[0, 1, 0, 0, 1, 0, 0], #c12
                        [1, 0, 1, 0, 0, 1, 1], #c13
                        [1, 1, 1, 0, 1, 1, 1], #c23
                        [1, 1, 1, 1, 0, 0, 0], #maths
                        [0, 1, 0, 0, 1, 0, 0], #spc
                        [0, 0, 0, -1, 1, 1, 1] #svt
                       ])
#s = array([3., 2., 3.])
objectifs = [21,
             12,
             33,
             27,
             19,
             3.5
             ]
s = array(objectifs)

G = array([[0, 1, 1, 0, 0, 0, 0], [0, 0, 0, 0, 1, 1, 0]])
h = array([24, 15])

l = array([0] * 7)
u = array([13, 24, 24, 8, 15, 15, 1])

#h = array([3., 2., -2.]).reshape((3,))

debut = time.time()
x_sol = solve_ls(R, s, G, h, lb=l, ub=u, solver="osqp")
print(time.time()-debut)
print(f"LS solution: {x_sol = }")

I hope it can help finding the bug.

Thanks.

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