def test_CustomGraphOneTwoCollors(self): solver = SAT_solver() graph = [[0, 1, 1, 1, 1], [1, 0, 1, 1, 0], [1, 1, 0, 1, 0], [1, 1, 1, 0, 1], [1, 0, 0, 1, 0]] colors = 2 formula = graph_coloring(graph, colors) solution = solver.solve(formula) self.assertFalse(solution[0])
def test_completeGraphTwoCollors(self): solver = SAT_solver() graph = [[1, 1, 1], [1, 1, 1], [1, 1, 1]] colors = 2 formula = graph_coloring(graph, colors) solution = solver.solve(formula) self.assertFalse(solution[0])
def test_CustomGraphOneFourCollors(self): solver = SAT_solver() graph = [[0, 1, 1, 1, 1], [1, 0, 1, 1, 0], [1, 1, 0, 1, 0], [1, 1, 1, 0, 1], [1, 0, 0, 1, 0]] colors = 4 formula = graph_coloring(graph, colors) solution = solver.solve(formula) self.assertTrue(solution[0]) self.assertEqual("true", formula.nnf().cnf().evaluate(solution[1]).__class__.__name__)
def test_completeGraphThreeCollors(self): solver = SAT_solver() graph = [[1, 1, 1], [1, 1, 1], [1, 1, 1]] colors = 3 formula = graph_coloring(graph, colors) solution = solver.solve(formula) self.assertTrue(solution[0]) self.assertEqual("true", formula.nnf().cnf().evaluate(solution[1]).__class__.__name__)
def test_OddCicleGraphTwoCollors(self): solver = SAT_solver() graph = [ [0, 1, 1], [1, 0, 1], [1, 1, 0], ] colors = 2 formula = graph_coloring(graph, colors) solution = solver.solve(FlatCNF(formula)) self.assertFalse(solution[0])
def test_EvenCicleGraphTwoCollors(self): solver = SAT_solver() graph = [ [0, 1, 0, 1], [1, 0, 1, 0], [0, 1, 0, 1], [1, 0, 1, 0], ] colors = 2 formula = graph_coloring(graph, colors) solution = solver.solve(FlatCNF(formula)) self.assertTrue(solution[0]) self.assertEqual("true", formula.nnf().cnf().evaluate(solution[1]).__class__.__name__)
def test_SudokuCustom(self): solver = SAT_solver() board=[[4, 8, None, 1, 6, None, None, None, 7], [1, None, 7, 4, None, 3, 6, None, None], [3, None, None, 5, None, None, 4, 2, None], [None, 9, None, None, 3, 2, 7, None, 4], [None, None, None, None, None, None, None, None, None], [2, None, 4, 8, 1, None, None, 6, None], [None, 4, 1, None, None, 8, None, None, 6], [None, None, 6, 7, None, 1, 9, None, 3], [7, None, None, None, 9, 6, None, 4, None]] formula = sudoku(board) solution = solver.solve(formula,True) self.assertTrue(solution[0]) self.assertEqual("true", formula.nnf().cnf().evaluate(solution[1]).__class__.__name__)
def test_SudokuMedium(self): solver = SAT_solver() board=[[None, None, 9, None, 6, 4, None, None, 1], [None, None, None, None, 5, None, None, None, None], [4, 6, None, 1, None, 7, None, None, 8], [None, None, None, None, None, None, None, 9, None], [None, None, None, None, 3, None, None, 1, None], [3, None, None, None, None, None, None, 4, None], [None, 4, 8, None, None, None, 2, None, None], [2, None, 7, None, 4, 5, None, 8, 6], [5, None, None, None, None, None, None, None, None]] formula = sudoku(board) solution = solver.solve(FlatCNF(formula)) self.assertTrue(solution[0]) self.assertEqual("true", formula.nnf().cnf().evaluate(solution[1]).__class__.__name__)
def test_SudokuEasy(self): solver = SAT_solver() board=[[None, None, None, 4, None, None, None, 5, None], [None, None, None, None, 1, None, 3, 6, None], [None, None, 8, None, None, 6, 9, 4, 7], [1, None, 2, None, None, None, None, 9, 5], [None, 9, None, 2, None, 1, None, None, None], [None, None, None, 5, 9, 3, None, None, None], [4, None, None, None, None, None, 1, 7, 9], [7, 2, None, 1, None, None, None, None, None], [None, 8, None, None, None, 9, None, 2, None]] formula = sudoku(board) solution = solver.solve(FlatCNF(formula)) self.assertTrue(solution[0]) self.assertEqual("true", formula.nnf().cnf().evaluate(solution[1]).__class__.__name__)
#!/usr/bin/env python import sys sys.path.append("./src") from sat import SAT_solver from sudoku import sudoku, printSudoku, processResult print "=================================================" print "SUDOKU" print "=================================================" solver = SAT_solver() # define board as follows. # board is array with nine arrays (rows). # rows are arrays of nine elements. # elements are None or int in [1,9]. # None - empty square. board = [ [None, 8, None, 1, 6, None, None, None, 7], [1, None, 7, 4, None, 3, 6, None, None], [3, None, None, 5, None, None, 4, 2, None], [None, 9, None, None, 3, 2, 7, None, 4], [None, None, None, None, None, None, None, None, None], [2, None, 4, 8, 1, None, None, 6, None], [None, 4, 1, None, None, 8, None, None, 6], [None, None, 6, 7, None, 1, 9, None, 3], [7, None, None, None, 9, 6, None, 4, None], ]
def test_contradiction(self): solver = SAT_solver() formula = And([Var("A"), Not(Var("A"))]) result = solver.solve(formula) self.assertFalse(result[0])
def test_Or(self): solver = SAT_solver() formula = Or([Var("A"), Var("B")]) result = solver.solve(formula) self.assertTrue(result[0]) self.assertEqual("true", formula.nnf().cnf().evaluate(result[1]).__class__.__name__)
def test_variableNegation(self): solver = SAT_solver() formula = Not(Var("A")) result = solver.solve(formula) self.assertTrue(result[0]) self.assertEqual("true", formula.nnf().cnf().evaluate(result[1]).__class__.__name__)
def test_false(self): solver = SAT_solver() self.assertFalse(solver.solve(false())[0])
def test_true(self): solver = SAT_solver() self.assertTrue(solver.solve(true())[0])
#!/usr/bin/env python import sys sys.path.append("./src") from graphColoring import graph_coloring, printGraph, processResult from sat import SAT_solver, FlatCNF #instance of sat solver solver = SAT_solver() #graph represented with adjacency matrix graph = [ [1, 1, 1], [1, 1, 1], [1, 1, 1], ] #number of colors for graph coloring colors = 3 #construct formula for certain graph and number of colors formula = graph_coloring(graph, colors) #solve formula solution = solver.solve(formula) #solve2 formula solution2 = solver.solve(formula,True) #flatcnf solution solution3 = solver.solve(FlatCNF(formula))
print "Expression (p->True): " + unicode(newexpr2) print "Expression (z->True): " + unicode(newexpr3) print "=================================================" print "Testing deduplicate method." print "=================================================" dedupexpr = And([ Or([Var("x1"), Var("x2")]) ]) print "Expession: " + unicode(dedupexpr) + " -> " + unicode(dedupexpr.deduplicate()) dedupexpr = And([ Or([Var("x1"), Var("x1")]) ]) print "Expession: " + unicode(dedupexpr) + " -> " + unicode(dedupexpr.deduplicate()) print "=================================================" print "=================================================" print "SAT Solver Testing" print "=================================================" solver = SAT_solver() for i in globals().keys(): if i[:4] == "expr": print i, ":", unicode(globals()[i]), "->", solver.solve(globals()[i]) print unicode(true()), "->", solver.solve(true()) print "=================================================" print "sudoku" board=[[4, 8, None, 1, 6, None, None, None, 7], [1, None, 7, 4, None, 3, 6, None, None], [3, None, None, 5, None, None, 4, 2, None], [None, 9, None, None, 3, 2, 7, None, 4], [None, None, None, None, None, None, None, None, None], [2, None, 4, 8, 1, None, None, 6, None], [None, 4, 1, None, None, 8, None, None, 6],
def test_variable(self): solver = SAT_solver() formula = Var("A") result = solver.solve(FlatCNF(formula)) self.assertTrue(result[0]) self.assertEqual("true", formula.nnf().cnf().evaluate(result[1]).__class__.__name__)
def test_false(self): solver = SAT_solver() self.assertFalse(solver.solve(FlatCNF(false()))[0],True)
def test_true(self): solver = SAT_solver() self.assertTrue(solver.solve(FlatCNF(true()))[0],True)
print "Expression: " + unicode(expr4) print "Evaluate (x->False): " + unicode(expr4.nnf().cnf().deduplicate().evaluate({"x": False})) print "Evaluate (x->True): " + unicode(expr4.nnf().cnf().deduplicate().evaluate({"x": True})) # #========================================== # SAT solver #========================================== # argument - formula # returns - (boolean value, dictionary) # - value indicates if formula is satisfiable. # - dictionary represents mapping of variables. #========================================== print "=================================================" print "SAT Solver" print "=================================================" solver = SAT_solver() for i in globals().keys(): if i[:4] == "expr": print i, ":", unicode(globals()[i]), "->", solver.solve(globals()[i]) print "=================================================" print "SAT Solver - mt" print "=================================================" solver = SAT_solver() for i in globals().keys(): if i[:4] == "expr": print i, ":", unicode(globals()[i]), "->", solver.solve(globals()[i],True) print "=================================================" print "SAT Solver - multiprocess"
#!/usr/bin/env python import sys sys.path.append("./src") from sat import SAT_solver, FlatCNF from sudoku import sudoku, printSudoku, processResult print "=================================================" print "SUDOKU" print "=================================================" solver = SAT_solver() # define board as follows. # board is array with nine arrays (rows). # rows are arrays of nine elements. # elements are None or int in [1,9]. # None - empty square. board = [[None, 8, None, 1, 6, None, None, None, 7], [1, None, 7, 4, None, 3, 6, None, None], [3, None, None, 5, None, None, 4, 2, None], [None, 9, None, None, 3, 2, 7, None, 4], [None, None, None, None, None, None, None, None, None], [2, None, 4, 8, 1, None, None, 6, None], [None, 4, 1, None, None, 8, None, None, 6], [None, None, 6, 7, None, 1, 9, None, 3], [7, None, None, None, 9, 6, None, 4, None]] # print sudoku from board definition. print "Lab exercise:" print printSudoku(board)