Closed
Description
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
Labels
No labels