def test_at_least_one(self): cardinality = cardnet.at_least(self.function.support, 1) sat = expr.And(self.function, *cardinality).to_cnf().satisfy_one() self.assertIsNotNone(sat) solution = {x: sat.get(x) for x in self.pos} self.assertEqual(solution, {x: 1 for x in self.pos})
def test_at_least_is_not_equivalent(self): at_least = expr.exprvar("at_least") cardinality = cardnet.at_least(self.function.support, len(self.pos), ~at_least) sat = expr.And(self.function, ~at_least, *cardinality).to_cnf().satisfy_one() self.assertIsNotNone(sat) self.assertEqual(sat.get(at_least), 0)
def test_at_least_higher(self): cardinality = cardnet.at_least(self.function.support, len(self.pos) + 1) sat = expr.And(self.function, *cardinality).to_cnf().satisfy_one() self.assertIsNone(sat)
def at_least(inputs, p, equivalent=None): if p == 1: yield from at_least_one(inputs, equivalent) else: yield from cardnet.at_least(inputs, p, equivalent)