Source code for cvxpy.reductions.eval_params

from cvxpy import problems
from cvxpy.error import ParameterError
from cvxpy.expressions.constants.constant import Constant
from cvxpy.expressions.constants.parameter import Parameter
from cvxpy.reductions.reduction import Reduction


def replace_params_with_consts(expr):
    if isinstance(expr, list):
        return [replace_params_with_consts(elem) for elem in expr]
    elif len(expr.parameters()) == 0:
        return expr
    elif isinstance(expr, Parameter):
        if expr.value is None:
            raise ParameterError("Problem contains unspecified parameters.")
        return Constant(expr.value)
    else:
        new_args = []
        for arg in expr.args:
            new_args.append(replace_params_with_consts(arg))
        return expr.copy(new_args)


[docs]class EvalParams(Reduction): """Replaces symbolic parameters with their constant values."""
[docs] def accepts(self, problem) -> bool: return True
[docs] def apply(self, problem): """Replace parameters with constant values. Parameters ---------- problem : Problem The problem whose parameters should be evaluated. Returns ------- Problem A new problem where the parameters have been converted to constants. Raises ------ ParameterError If the ``problem`` has unspecified parameters (i.e., a parameter whose value is None). """ # Do not instantiate a new objective if it does not contain # parameters. if len(problem.objective.parameters()) > 0: obj_expr = replace_params_with_consts(problem.objective.expr) objective = type(problem.objective)(obj_expr) else: objective = problem.objective constraints = [] for c in problem.constraints: args = [] for arg in c.args: args.append(replace_params_with_consts(arg)) # Do not instantiate a new constraint object if it did not # contain parameters. if all(id(new) == id(old) for new, old in zip(args, c.args)): constraints.append(c) # Otherwise, create a copy of the constraint. else: data = c.get_data() if data is not None: constraints.append(type(c)(*(args + data))) else: constraints.append(type(c)(*args)) return problems.problem.Problem(objective, constraints), []
[docs] def invert(self, solution, inverse_data): """Returns a solution to the original problem given the inverse_data. """ return solution