Example #1
0
 def test_xfrm_atleast_nested(self):
     m = _generate_boolean_model(4)
     m.p = LogicalConstraint(expr=atleast(1, atleast(2, m.Y[1], m.Y[1].lor(m.Y[2]), m.Y[2]).lor(m.Y[3]), m.Y[4]))
     TransformationFactory('core.logical_to_linear').apply_to(m)
     Y_aug = m.logic_to_linear.augmented_vars
     self.assertEqual(len(Y_aug), 3)
     _constrs_contained_within(
         self, [
             (1, Y_aug[1].get_associated_binary() + m.Y[4].get_associated_binary(), None),
             (1, 1 - Y_aug[2].get_associated_binary() + Y_aug[1].get_associated_binary(), None),
             (1, 1 - m.Y[3].get_associated_binary() + Y_aug[1].get_associated_binary(), None),
             (1,
              Y_aug[2].get_associated_binary() + m.Y[3].get_associated_binary()
              + 1 - Y_aug[1].get_associated_binary(),
              None),
             (1, 1 - m.Y[1].get_associated_binary() + Y_aug[3].get_associated_binary(), None),
             (1, 1 - m.Y[2].get_associated_binary() + Y_aug[3].get_associated_binary(), None),
             (1,
              m.Y[1].get_associated_binary() + m.Y[2].get_associated_binary() + 1 - Y_aug[3].get_associated_binary(),
              None),
             (None,
              2 - 2 * (1 - Y_aug[2].get_associated_binary())
              - (m.Y[1].get_associated_binary() + Y_aug[3].get_associated_binary() + m.Y[2].get_associated_binary()),
              0),
             (None,
              m.Y[1].get_associated_binary() + Y_aug[3].get_associated_binary() + m.Y[2].get_associated_binary()
              - (1 + 2 * Y_aug[2].get_associated_binary()),
              0)
         ], m.logic_to_linear.transformed_constraints)
 def test_nary_atleast(self):
     nargs = 5
     m = ConcreteModel()
     m.s = RangeSet(nargs)
     m.Y = BooleanVar(m.s)
     for truth_combination in _generate_possible_truth_inputs(nargs):
         for ntrue in range(nargs + 1):
             m.Y.set_values(dict(enumerate(truth_combination, 1)))
             correct_value = sum(truth_combination) >= ntrue
             self.assertEqual(value(atleast(ntrue, *(m.Y[i] for i in m.s))),
                              correct_value)
             self.assertEqual(value(atleast(ntrue, m.Y)), correct_value)
Example #3
0
 def test_xfrm_atleast_statement(self):
     m = ConcreteModel()
     m.s = RangeSet(3)
     m.Y = BooleanVar(m.s)
     m.p = LogicalConstraint(expr=atleast(2, m.Y[1], m.Y[2], m.Y[3]))
     TransformationFactory('core.logical_to_linear').apply_to(m)
     _constrs_contained_within(self,
                               [(2, m.Y[1].get_associated_binary() +
                                 m.Y[2].get_associated_binary() +
                                 m.Y[3].get_associated_binary(), None)],
                               m.logic_to_linear.transformed_constraints)
    def test_to_string(self):
        m = ConcreteModel()
        m.Y1 = BooleanVar()
        m.Y2 = BooleanVar()
        m.Y3 = BooleanVar()

        self.assertEqual(str(land(m.Y1, m.Y2, m.Y3)), "Y1 ∧ Y2 ∧ Y3")
        self.assertEqual(str(lor(m.Y1, m.Y2, m.Y3)), "Y1 ∨ Y2 ∨ Y3")
        self.assertEqual(str(equivalent(m.Y1, m.Y2)), "Y1 iff Y2")
        self.assertEqual(str(implies(m.Y1, m.Y2)), "Y1 --> Y2")
        self.assertEqual(str(xor(m.Y1, m.Y2)), "Y1 ⊻ Y2")
        self.assertEqual(str(atleast(1, m.Y1, m.Y2)), "atleast(1: [Y1, Y2])")
        self.assertEqual(str(atmost(1, m.Y1, m.Y2)), "atmost(1: [Y1, Y2])")
        self.assertEqual(str(exactly(1, m.Y1, m.Y2)), "exactly(1: [Y1, Y2])")

        # Precedence check
        self.assertEqual(str(m.Y1.implies(m.Y2).lor(m.Y3)), "(Y1 --> Y2) ∨ Y3")
    def test_cnf(self):
        m = ConcreteModel()
        m.Y1 = BooleanVar()
        m.Y2 = BooleanVar()

        implication = implies(m.Y1, m.Y2)
        x = to_cnf(implication)[0]
        _check_equivalent(self, implication, x)

        atleast_expr = atleast(1, m.Y1, m.Y2)
        x = to_cnf(atleast_expr)[0]
        self.assertIs(atleast_expr, x)  # should be no change

        nestedatleast = implies(m.Y1, atleast_expr)
        m.extraY = BooleanVarList()
        indicator_map = ComponentMap()
        x = to_cnf(nestedatleast, m.extraY, indicator_map)
        self.assertEqual(str(x[0]), "extraY[1] ∨ ~Y1")
        self.assertIs(indicator_map[m.extraY[1]], atleast_expr)
Example #6
0
    def test_xfrm_special_atoms_nonroot(self):
        m = ConcreteModel()
        m.s = RangeSet(3)
        m.Y = BooleanVar(m.s)
        m.p = LogicalConstraint(
            expr=m.Y[1].implies(atleast(2, m.Y[1], m.Y[2], m.Y[3])))
        TransformationFactory('core.logical_to_linear').apply_to(m)
        Y_aug = m.logic_to_linear.augmented_vars
        self.assertEqual(len(Y_aug), 1)
        self.assertEqual(Y_aug[1].domain, BooleanSet)
        _constrs_contained_within(
            self, [(None, sum(m.Y[:].get_associated_binary()) -
                    (1 + 2 * Y_aug[1].get_associated_binary()), 0),
                   (1, (1 - m.Y[1].get_associated_binary()) +
                    Y_aug[1].get_associated_binary(), None),
                   (None, 2 - 2 * (1 - Y_aug[1].get_associated_binary()) -
                    sum(m.Y[:].get_associated_binary()), 0)],
            m.logic_to_linear.transformed_constraints)

        m = ConcreteModel()
        m.s = RangeSet(3)
        m.Y = BooleanVar(m.s)
        m.p = LogicalConstraint(
            expr=m.Y[1].implies(atmost(2, m.Y[1], m.Y[2], m.Y[3])))
        TransformationFactory('core.logical_to_linear').apply_to(m)
        Y_aug = m.logic_to_linear.augmented_vars
        self.assertEqual(len(Y_aug), 1)
        self.assertEqual(Y_aug[1].domain, BooleanSet)
        _constrs_contained_within(
            self, [(None, sum(m.Y[:].get_associated_binary()) -
                    (1 - Y_aug[1].get_associated_binary() + 2), 0),
                   (1, (1 - m.Y[1].get_associated_binary()) +
                    Y_aug[1].get_associated_binary(), None),
                   (None, 3 - 3 * Y_aug[1].get_associated_binary() -
                    sum(m.Y[:].get_associated_binary()), 0)],
            m.logic_to_linear.transformed_constraints)

        m = ConcreteModel()
        m.s = RangeSet(3)
        m.Y = BooleanVar(m.s)
        m.p = LogicalConstraint(
            expr=m.Y[1].implies(exactly(2, m.Y[1], m.Y[2], m.Y[3])))
        TransformationFactory('core.logical_to_linear').apply_to(m)
        Y_aug = m.logic_to_linear.augmented_vars
        self.assertEqual(len(Y_aug), 3)
        self.assertEqual(Y_aug[1].domain, BooleanSet)
        _constrs_contained_within(self, [
            (1, (1 - m.Y[1].get_associated_binary()) +
             Y_aug[1].get_associated_binary(), None),
            (None, sum(m.Y[:].get_associated_binary()) -
             (1 - Y_aug[1].get_associated_binary() + 2), 0),
            (None, 2 - 2 * (1 - Y_aug[1].get_associated_binary()) -
             sum(m.Y[:].get_associated_binary()), 0),
            (1, sum(Y_aug[:].get_associated_binary()), None),
            (None, sum(m.Y[:].get_associated_binary()) -
             (1 + 2 * (1 - Y_aug[2].get_associated_binary())), 0),
            (None, 3 - 3 * (1 - Y_aug[3].get_associated_binary()) -
             sum(m.Y[:].get_associated_binary()), 0),
        ], m.logic_to_linear.transformed_constraints)

        # Note: x is now a variable
        m = ConcreteModel()
        m.s = RangeSet(3)
        m.Y = BooleanVar(m.s)
        m.x = Var(bounds=(1, 3))
        m.p = LogicalConstraint(
            expr=m.Y[1].implies(exactly(m.x, m.Y[1], m.Y[2], m.Y[3])))
        TransformationFactory('core.logical_to_linear').apply_to(m)
        Y_aug = m.logic_to_linear.augmented_vars
        self.assertEqual(len(Y_aug), 3)
        self.assertEqual(Y_aug[1].domain, BooleanSet)
        _constrs_contained_within(self, [
            (1, (1 - m.Y[1].get_associated_binary()) +
             Y_aug[1].get_associated_binary(), None),
            (None, sum(m.Y[:].get_associated_binary()) -
             (m.x + 2 * (1 - Y_aug[1].get_associated_binary())), 0),
            (None, m.x - 3 * (1 - Y_aug[1].get_associated_binary()) -
             sum(m.Y[:].get_associated_binary()), 0),
            (1, sum(Y_aug[:].get_associated_binary()), None),
            (None, sum(m.Y[:].get_associated_binary()) -
             (m.x - 1 + 3 * (1 - Y_aug[2].get_associated_binary())), 0),
            (None, m.x + 1 - 4 * (1 - Y_aug[3].get_associated_binary()) -
             sum(m.Y[:].get_associated_binary()), 0),
        ], m.logic_to_linear.transformed_constraints)