lumix.goal_programming.relaxation.relax_constraint¶
- lumix.goal_programming.relaxation.relax_constraint(constraint, goal_metadata)[source]¶
Relax a constraint by adding deviation variables.
Transforms the constraint based on its type: - LE (expr <= rhs): expr + neg_dev - pos_dev == rhs (minimize pos_dev) - GE (expr >= rhs): expr + neg_dev - pos_dev == rhs (minimize neg_dev) - EQ (expr == rhs): expr + neg_dev - pos_dev == rhs (minimize both)
- Parameters:
constraint (
LXConstraint[TypeVar(TModel)]) – Original goal constraint to relaxgoal_metadata (
LXGoalMetadata) – Goal metadata with priority and weight info
- Return type:
RelaxedConstraint[TypeVar(TModel)]- Returns:
RelaxedConstraint containing the equality constraint with deviations and the deviation variable families
- Raises:
ValueError – If constraint has no LHS expression
Example
>>> goal = LXConstraint[Product]("production_goal") ... .expression(production_expr) ... .ge() ... .rhs(lambda p: p.target) >>> relaxed = relax_constraint(goal, goal_metadata) >>> # Now: production_expr + neg_dev - pos_dev == target >>> # Objective: minimize neg_dev (under-production is bad for GE)