def test_time(self): SAT_TIME_LIMIT = 1 clauses = self.get_clauses() #returns a few hundred short clauses t0 = time.time() solver = Solver(threads=4, time_limit=SAT_TIME_LIMIT) solver.add_clauses(clauses) sat, sol = solver.solve() took_time = time.time() - t0 # NOTE: the above CNF solves in about 1 hour. # So anything below 10min is good. Setting 2s would work... no most # systems, but not on overloaded CI servers self.assertLess(took_time, 4)
def setup(self, m, threads=1, **kwargs): from pycryptosat import Solver solver = Solver(threads=threads) solver.add_clauses(self._clauses.as_list()) return solver
class TestSolve(unittest.TestCase): def setUp(self): self.solver = Solver(threads=2) def test_wrong_args(self): self.assertRaises(TypeError, self.solver.add_clause, 'A') self.assertRaises(TypeError, self.solver.add_clause, 1) self.assertRaises(TypeError, self.solver.add_clause, 1.0) self.assertRaises(TypeError, self.solver.add_clause, object()) self.assertRaises(TypeError, self.solver.add_clause, ['a']) self.assertRaises(TypeError, self.solver.add_clause, [[1, 2], [3, None]]) self.assertRaises(ValueError, self.solver.add_clause, [1, 0]) def test_no_clauses(self): for _ in range(7): self.assertEqual(self.solver.solve([]), (True, (None, ))) def test_cnf1(self): for cl in clauses1: self.solver.add_clause(cl) res, solution = self.solver.solve() self.assertEqual(res, True) self.assertTrue(check_solution(clauses1, solution)) def test_add_clauses(self): self.solver.add_clauses([[1], [-1]]) res, solution = self.solver.solve() self.assertEqual(res, False) def test_add_clauses_wrong_zero(self): self.assertRaises(TypeError, self.solver.add_clause, [[1, 0], [-1]]) def test_add_clauses_array_SAT(self): cls = array('i', [1, 2, 0, 1, 2, 0]) self.solver.add_clauses(cls) res, solution = self.solver.solve() self.assertEqual(res, True) def test_add_clauses_array_UNSAT(self): cls = array('i', [-1, 0, 1, 0]) self.solver.add_clauses(cls) res, solution = self.solver.solve() self.assertEqual(res, False) def test_add_clauses_array_unterminated(self): cls = array('i', [1, 2, 0, 1, 2]) self.assertRaises(ValueError, self.solver.add_clause, cls) def test_bad_iter(self): class Liar: def __iter__(self): return None self.assertRaises(TypeError, self.solver.add_clause, Liar()) def test_get_conflict(self): self.solver.add_clauses([[-1], [2], [3], [-4]]) assume = [-2, 3, 4] res, model = self.solver.solve(assumptions=assume) self.assertEqual(res, False) confl = self.solver.get_conflict() self.assertEqual(isinstance(confl, list), True) self.assertNotIn(3, confl) if 2 in confl: self.assertIn(2, confl) elif -4 in confl: self.assertIn(-4, confl) else: self.assertEqual(False, True, msg="Either -2 or 4 should be conflicting!") assume = [2, 4] res, model = self.solver.solve(assumptions=assume) self.assertEqual(res, False) confl = self.solver.get_conflict() self.assertEqual(isinstance(confl, list), True) self.assertNotIn(2, confl) self.assertIn(-4, confl) def test_cnf2(self): for cl in clauses2: self.solver.add_clause(cl) self.assertEqual(self.solver.solve(), (False, None)) def test_cnf3(self): for cl in clauses3: self.solver.add_clause(cl) res, solution = self.solver.solve() self.assertEqual(res, True) self.assertTrue(check_solution(clauses3, solution)) def test_cnf1_confl_limit(self): for _ in range(1, 20): self.setUp() for cl in clauses1: self.solver.add_clause(cl) res, solution = self.solver.solve() self.assertTrue(res is None or check_solution(clauses1, solution)) def test_by_re_curse(self): self.solver.add_clause([-1, -2, 3]) res, _ = self.solver.solve() self.assertEqual(res, True) self.solver.add_clause([-5, 1]) self.solver.add_clause([4, -3]) self.solver.add_clause([2, 3, 5]) res, _ = self.solver.solve() self.assertEqual(res, True)
from pycryptosat import Solver s = Solver() s.add_clauses([(1,), (1, -1)]) assert s.is_satisfiable() s.add_clauses([(1,), (-1,)]) assert not s.is_satisfiable()
class TestSolve(unittest.TestCase): def setUp(self): self.solver = Solver(threads=2) def test_wrong_args(self): self.assertRaises(TypeError, self.solver.add_clause, 'A') self.assertRaises(TypeError, self.solver.add_clause, 1) self.assertRaises(TypeError, self.solver.add_clause, 1.0) self.assertRaises(TypeError, self.solver.add_clause, object()) self.assertRaises(TypeError, self.solver.add_clause, ['a']) self.assertRaises( TypeError, self.solver.add_clause, [[1, 2], [3, None]]) self.assertRaises(ValueError, self.solver.add_clause, [1, 0]) def test_no_clauses(self): for _ in range(7): self.assertEqual(self.solver.solve([]), (True, (None,))) def test_cnf1(self): for cl in clauses1: self.solver.add_clause(cl) res, solution = self.solver.solve() self.assertEqual(res, True) self.assertTrue(check_solution(clauses1, solution)) def test_add_clauses(self): self.solver.add_clauses([[1], [-1]]) res, solution = self.solver.solve() self.assertEqual(res, False) def test_add_clauses_wrong_zero(self): self.assertRaises(TypeError, self.solver.add_clause, [[1, 0], [-1]]) def test_add_clauses_array_SAT(self): cls = array('i', [1, 2, 0, 1, 2, 0]) self.solver.add_clauses(cls) res, solution = self.solver.solve() self.assertEqual(res, True) def test_add_clauses_array_UNSAT(self): cls = array('i', [-1, 0, 1, 0]) self.solver.add_clauses(cls) res, solution = self.solver.solve() self.assertEqual(res, False) def test_add_clauses_array_unterminated(self): cls = array('i', [1, 2, 0, 1, 2]) self.assertRaises(ValueError, self.solver.add_clause, cls) def test_bad_iter(self): class Liar: def __iter__(self): return None self.assertRaises(TypeError, self.solver.add_clause, Liar()) def test_get_conflict(self): self.solver.add_clauses([[-1], [2], [3], [-4]]) assume = [-2, 3, 4] res, model = self.solver.solve(assumptions=assume) self.assertEqual(res, False) confl = self.solver.get_conflict() self.assertEqual(isinstance(confl, list), True) self.assertNotIn(3, confl) if 2 in confl: self.assertIn(2, confl) elif -4 in confl: self.assertIn(-4, confl) else: self.assertEqual(False, True, msg="Either -2 or 4 should be conflicting!") assume = [2, 4] res, model = self.solver.solve(assumptions=assume) self.assertEqual(res, False) confl = self.solver.get_conflict() self.assertEqual(isinstance(confl, list), True) self.assertNotIn(2, confl) self.assertIn(-4, confl) def test_cnf2(self): for cl in clauses2: self.solver.add_clause(cl) self.assertEqual(self.solver.solve(), (False, None)) def test_cnf3(self): for cl in clauses3: self.solver.add_clause(cl) res, solution = self.solver.solve() self.assertEqual(res, True) self.assertTrue(check_solution(clauses3, solution)) def test_cnf1_confl_limit(self): for _ in range(1, 20): self.setUp() for cl in clauses1: self.solver.add_clause(cl) res, solution = self.solver.solve() self.assertTrue(res is None or check_solution(clauses1, solution)) def test_by_re_curse(self): self.solver.add_clause([-1, -2, 3]) res, _ = self.solver.solve() self.assertEqual(res, True) self.solver.add_clause([-5, 1]) self.solver.add_clause([4, -3]) self.solver.add_clause([2, 3, 5]) res, _ = self.solver.solve() self.assertEqual(res, True)
class TestSolve(unittest.TestCase): def setUp(self): self.solver = Solver(threads=2) def test_wrong_args(self): self.assertRaises(TypeError, self.solver.add_clause, 'A') self.assertRaises(TypeError, self.solver.add_clause, 1) self.assertRaises(TypeError, self.solver.add_clause, 1.0) self.assertRaises(TypeError, self.solver.add_clause, object()) self.assertRaises(TypeError, self.solver.add_clause, ['a']) self.assertRaises(TypeError, self.solver.add_clause, [[1, 2], [3, None]]) self.assertRaises(ValueError, self.solver.add_clause, [1, 0]) def test_no_clauses(self): for _ in range(7): self.assertEqual(self.solver.solve([]), (True, (None, ))) def test_cnf1(self): for cl in clauses1: self.solver.add_clause(cl) res, solution = self.solver.solve() self.assertEqual(res, True) self.assertTrue(check_solution(clauses1, solution)) def test_add_clauses(self): self.solver.add_clauses([[1], [-1]]) res, solution = self.solver.solve() self.assertEqual(res, False) def test_add_clauses_wrong_zero(self): self.assertRaises(TypeError, self.solver.add_clause, [[1, 0], [-1]]) def test_add_clauses_array_SAT(self): cls = array('i', [1, 2, 0, 1, 2, 0]) self.solver.add_clauses(cls) res, solution = self.solver.solve() self.assertEqual(res, True) def test_add_clauses_array_UNSAT(self): cls = array('i', [-1, 0, 1, 0]) self.solver.add_clauses(cls) res, solution = self.solver.solve() self.assertEqual(res, False) def test_add_clauses_array_unterminated(self): cls = array('i', [1, 2, 0, 1, 2]) self.assertRaises(ValueError, self.solver.add_clause, cls) def test_bad_iter(self): class Liar: def __iter__(self): return None self.assertRaises(TypeError, self.solver.add_clause, Liar()) def test_cnf2(self): for cl in clauses2: self.solver.add_clause(cl) self.assertEqual(self.solver.solve(), (False, None)) def test_cnf3(self): for cl in clauses3: self.solver.add_clause(cl) res, solution = self.solver.solve() self.assertEqual(res, True) self.assertTrue(check_solution(clauses3, solution)) def test_cnf1_confl_limit(self): for _ in range(1, 20): self.setUp() for cl in clauses1: self.solver.add_clause(cl) res, solution = self.solver.solve() self.assertTrue(res is None or check_solution(clauses1, solution)) def test_by_re_curse(self): self.solver.add_clause([-1, -2, 3]) res, _ = self.solver.solve() self.assertEqual(res, True) self.solver.add_clause([-5, 1]) self.solver.add_clause([4, -3]) self.solver.add_clause([2, 3, 5]) res, _ = self.solver.solve() self.assertEqual(res, True)
def setup(self, clauses, m, threads=1): from pycryptosat import Solver solver = Solver(threads=threads) solver.add_clauses(clauses.as_list()) return solver