Torch

In this example we show how to use OSQP.torch.nn.

Python

import numpy.random as npr
import numpy as np
import torch
import scipy.sparse as spa

from osqp.nn.torch import OSQP

n_batch=1
n=10
m=3
P_scale=1.0
A_scale=1.0
u_scale=1.0
l_scale=1.0

npr.seed(1)
L = np.random.randn(n, n)
P = spa.csc_matrix(P_scale * L.dot(L.T))
x_0 = npr.randn(n)
s_0 = npr.rand(m)
A = spa.csc_matrix(A_scale * npr.randn(m, n))
u = A.dot(x_0) + A_scale * s_0
l = -10 * A_scale * npr.rand(m)
q = npr.randn(n)
true_x = npr.randn(n)

P_idx = P.nonzero()
P_shape = P.shape
A_idx = A.nonzero()
A_shape = A.shape

P_torch, q_torch, A_torch, l_torch, u_torch, true_x_torch = [
    torch.DoubleTensor(x) if len(x) > 0 else torch.DoubleTensor().requires_grad_() for x in [P.data, q, A.data, l, u, true_x]
]

for x in [P_torch, q_torch, A_torch, l_torch, u_torch]:
    x.requires_grad = True

problem = OSQP(
    P_idx,
    P_shape,
    A_idx,
    A_shape,
)
x_hats = problem(P_torch, q_torch, A_torch, l_torch, u_torch)

loss = (true_x_torch - x_hats).square().sum()
loss.backward()