def _apply_to(self, model): """Apply the transformation.""" m = model for constr in m.component_data_objects( ctype=Constraint, active=True, descend_into=True): if not constr.body.polynomial_degree() == 1: continue # we currently only process linear constraints repn = generate_standard_repn(constr.body) # get the index of all nonzero coefficient variables nonzero_vars_indx = [ i for i, _ in enumerate(repn.linear_vars) if not repn.linear_coefs[i] == 0 ] const = repn.constant # reconstitute the constraint, including only variable terms with # nonzero coefficients constr_body = quicksum(repn.linear_coefs[i] * repn.linear_vars[i] for i in nonzero_vars_indx) + const if constr.equality: constr.set_value(constr_body == constr.upper) elif constr.has_lb() and not constr.has_ub(): constr.set_value(constr_body >= constr.lower) elif constr.has_ub() and not constr.has_lb(): constr.set_value(constr_body <= constr.upper) else: # constraint is a bounded inequality of form a <= x <= b. constr.set_value(EXPR.inequality( constr.lower, constr_body, constr.upper))
def _apply_to(self, model): """Apply the transformation.""" m = model for constr in m.component_data_objects( ctype=Constraint, active=True, descend_into=True): if not constr.body.polynomial_degree() == 1: continue # we currently only process linear constraints repn = generate_standard_repn(constr.body) # get the index of all nonzero coefficient variables nonzero_vars_indx = [ i for i, _ in enumerate(repn.linear_vars) if not repn.linear_coefs[i] == 0 ] const = repn.constant # reconstitute the constraint, including only variable terms with # nonzero coefficients constr_body = quicksum(repn.linear_coefs[i] * repn.linear_vars[i] for i in nonzero_vars_indx) + const if constr.equality: constr.set_value(constr_body == constr.upper) elif constr.has_lb() and not constr.has_ub(): constr.set_value(constr_body >= constr.lower) elif constr.has_ub() and not constr.has_lb(): constr.set_value(constr_body <= constr.upper) else: # constraint is a bounded inequality of form a <= x <= b. constr.set_value(EXPR.inequality( constr.lower, constr_body, constr.upper))
def test_zero_term_removal(self): """Test for removing zero terms from linear constraints.""" m = ConcreteModel() m.v0 = Var() m.v1 = Var() m.v2 = Var() m.v3 = Var() m.c = Constraint(expr=m.v0 == m.v1 * m.v2 + m.v3) m.c2 = Constraint(expr=m.v1 * m.v2 + m.v3 <= m.v0) m.c3 = Constraint(expr=m.v0 <= m.v1 * m.v2 + m.v3) m.c4 = Constraint(expr=EXPR.inequality(1, m.v1 * m.v2 + m.v3, 3)) m.v1.fix(0) TransformationFactory('contrib.remove_zero_terms').apply_to(m) m.v1.unfix() # Check that the term no longer exists self.assertFalse( any(id(m.v1) == id(v) for v in EXPR.identify_variables(m.c.body))) self.assertFalse( any(id(m.v1) == id(v) for v in EXPR.identify_variables(m.c2.body))) self.assertFalse( any(id(m.v1) == id(v) for v in EXPR.identify_variables(m.c3.body))) self.assertFalse( any(id(m.v1) == id(v) for v in EXPR.identify_variables(m.c4.body)))
def test_zero_term_removal(self): """Test for removing zero terms from linear constraints.""" m = ConcreteModel() m.v0 = Var() m.v1 = Var() m.v2 = Var() m.v3 = Var() m.c = Constraint(expr=m.v0 == m.v1 * m.v2 + m.v3) m.c2 = Constraint(expr=m.v1 * m.v2 + m.v3 <= m.v0) m.c3 = Constraint(expr=m.v0 <= m.v1 * m.v2 + m.v3) m.c4 = Constraint(expr=EXPR.inequality(1, m.v1 * m.v2 + m.v3, 3)) m.v1.fix(0) TransformationFactory('contrib.remove_zero_terms').apply_to(m) m.v1.unfix() # Check that the term no longer exists self.assertFalse(any(id(m.v1) == id(v) for v in EXPR.identify_variables(m.c.body))) self.assertFalse(any(id(m.v1) == id(v) for v in EXPR.identify_variables(m.c2.body))) self.assertFalse(any(id(m.v1) == id(v) for v in EXPR.identify_variables(m.c3.body))) self.assertFalse(any(id(m.v1) == id(v) for v in EXPR.identify_variables(m.c4.body)))