def test_not_at_most_one(self):
        self.function = expr.And(self.pos, expr.exprvar("b"),
                                 ~expr.Or(*self.neg))

        cardinality = constraint.at_most_one(self.function.support)
        sat = expr.And(self.function, *cardinality).to_cnf().satisfy_one()
        self.assertIsNone(sat)
    def test_at_most_one_zero(self):
        self.function = ~expr.Or(*self.neg)

        cardinality = constraint.at_most_one(self.function.support)
        sat = expr.And(self.function, *cardinality).to_cnf().satisfy_one()

        self.assertIsNotNone(sat)
    def test_at_most_one(self, function):
        cardinality_a = constraint.at_most_one(function.support)
        sat_a = expr.And(function, *cardinality_a).to_cnf().satisfy_one()

        cardinality_b = constraint.at_most(function.support, 1)
        sat_b = expr.And(function, *cardinality_b).to_cnf().satisfy_one()

        self.assertEqual(sat_a is None, sat_b is None)
    def test_at_most_one_not_equivalent(self):
        at_most = expr.exprvar("at_most")
        cardinality = constraint.at_most_one(self.function.support, ~at_most)
        sat = expr.And(self.function, ~at_most,
                       *cardinality).to_cnf().satisfy_one()

        self.assertIsNotNone(sat)
        self.assertEqual(sat.get(at_most), 0)
    def test_at_most_one_small(self):
        self.function = self.pos

        cardinality = constraint.at_most_one(self.function.support)
        sat = expr.And(self.function, *cardinality).to_cnf().satisfy_one()

        self.assertIsNotNone(sat)
        self.assertEqual(sat.get(self.pos), 1)
    def test_at_most_one_not_equivalent(self, function):
        equivalent = expr.exprvar("equivalent")

        cardinality_a = constraint.at_most_one(function.support, ~equivalent)
        sat_a = expr.And(function, ~equivalent,
                         *cardinality_a).to_cnf().satisfy_one()

        cardinality_b = constraint.at_most(function.support, 1, ~equivalent)
        sat_b = expr.And(function, ~equivalent,
                         *cardinality_b).to_cnf().satisfy_one()

        self.assertEqual(sat_a is None, sat_b is None)
        if sat_a or sat_b:
            self.assertEqual(sat_a.get(equivalent), sat_b.get(equivalent))