Skip to content

Add support for CallbackParam #72

Closed
@langestefan

Description

@langestefan

In order to simplify the user interface to model parameters, cvxpy supports CallbackParam.

This is purely a convenience function, because functions of parameters can always be computed in the user space.

Currently, cvxpygen does not support CallbackParam and so models of this form will not compile:

import cvxpy as cp
import numpy as np
from cvxpygen import cpg

# setup model
m, n = 3, 2
x = cp.Variable(n, name="x")
A = cp.Parameter((m, n), name="A", sparsity=((0, 0, 1), (0, 1, 1)))
b = cp.Parameter(m, name="b")
d = cp.Parameter(m, name="d")
bd = cp.CallbackParam(
    shape=(m,), callback=lambda: d.value * b.value, name="bd"
)
problem = cp.Problem(cp.Minimize(cp.sum_squares(A @ x - bd)), [x >= 0])

# set values for parameters
np.random.seed(0)
A.value = np.zeros((m, n))
A.value[0, 0] = np.random.randn()
A.value[0, 1] = np.random.randn()
A.value[1, 1] = np.random.randn()
b.value = np.random.randn(m)
d.value = np.random.randn(m)

# solve
problem.solve()

# code gen
cpg.generate_code(problem, code_dir="nonneg_LS", solver="SCS")

Trace:

PS C:\dev\warmteplanner\warmteplanner-embedded> uv run .\callback_param_test.py
C:\dev\warmteplanner\warmteplanner-embedded\.venv\Lib\site-packages\cvxpy\expressions\leaf.py:478: RuntimeWarning: Writing to a sparse CVXPY expression via `.value` is discouraged. Use `.value_sparse` instead
  warnings.warn('Writing to a sparse CVXPY expression via `.value` is discouraged.'
C:\dev\warmteplanner\warmteplanner-embedded\.venv\Lib\site-packages\cvxpy\expressions\leaf.py:480: RuntimeWarning: Accessing a sparse CVXPY expression via a dense representation. Please report this as a bug to the CVXPY Discord or GitHub.
  self.save_value(self._validate_value(val))
C:\dev\warmteplanner\warmteplanner-embedded\.venv\Lib\site-packages\cvxpy\expressions\leaf.py:467: RuntimeWarning: Reading from a sparse CVXPY expression via `.value` is discouraged. Use `.value_sparse` instead
  warnings.warn('Reading from a sparse CVXPY expression via `.value` is discouraged.'
Generating code with CVXPYgen ...
Traceback (most recent call last):
  File "C:\dev\warmteplanner\warmteplanner-embedded\callback_param_test.py", line 29, in <module>
    cpg.generate_code(problem, code_dir="nonneg_LS", solver="SCS")
    ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\dev\warmteplanner\warmteplanner-embedded\.venv\Lib\site-packages\cvxpygen\cpg.py", line 73, in generate_code
    write_c_code(problem, configuration, canon, canon_gradient, canon_solver, solver_interface, gradient_interface)
    ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\dev\warmteplanner\warmteplanner-embedded\.venv\Lib\site-packages\cvxpygen\cpg.py", line 583, in write_c_code
    write_file(os.path.join(configuration.code_dir, 'problem.pickle'), 'wb',
    ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
               lambda x, y: pickle.dump(y, x),
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
               cp.Problem(problem.objective, problem.constraints))
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\dev\warmteplanner\warmteplanner-embedded\.venv\Lib\site-packages\cvxpygen\utils.py", line 22, in write_file
    function(file, *args)
    ~~~~~~~~^^^^^^^^^^^^^
  File "C:\dev\warmteplanner\warmteplanner-embedded\.venv\Lib\site-packages\cvxpygen\cpg.py", line 584, in <lambda>
    lambda x, y: pickle.dump(y, x),
                 ~~~~~~~~~~~^^^^^^
_pickle.PicklingError: Can't pickle <function <lambda> at 0x0000022B9A5714E0>: attribute lookup <lambda> on __main__ failed

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions