Source code for csnlp.nlps.parameters
from typing import Generic, Literal, TypeVar
import casadi as cs
SymType = TypeVar("SymType", cs.SX, cs.MX)
[docs]
class HasParameters(Generic[SymType]):
"""Class for the creation and storage of symbolic parameters in an NLP problem.
Parameters
----------
sym_type : {"SX", "MX"}, optional
The CasADi symbolic variable type to use in the NLP, by default ``"SX"``.
"""
def __init__(self, sym_type: Literal["SX", "MX"] = "SX") -> None:
super().__init__()
self._sym_type: type[SymType] = getattr(cs, sym_type)
self._pars: dict[str, SymType] = {}
self._p = self._sym_type()
@property
def p(self) -> SymType:
"""Gets the parameters of the NLP scheme."""
return self._p
@property
def np(self) -> int:
"""Number of parameters in the NLP scheme."""
return self._p.shape[0]
@property
def parameters(self) -> dict[str, SymType]:
"""Gets the parameters of the NLP scheme."""
return self._pars
[docs]
def parameter(self, name: str, shape: tuple[int, int] = (1, 1)) -> SymType:
"""Adds a parameter to the NLP scheme.
Parameters
----------
name : str
Name of the new parameter. Must not be already in use.
shape : tuple of 2 ints, optional
Shape of the new parameter. By default a scalar, i.e., ``(1, 1)``.
Returns
-------
casadi.SX or MX
The symbol for the new parameter.
Raises
------
ValueError
Raises if there is already another parameter with the same name ``name``.
"""
if name in self._pars:
raise ValueError(f"Parameter name '{name}' already exists.")
par = self._sym_type.sym(name, *shape)
self._pars[name] = par
self._p = cs.veccat(self._p, par)
return par