def proccess_sat_file(filename, sat, solver): start_time = time.time() result = "{} || solver {} ".format(filename, solver) formula = CNF(from_file="./InstanciasSAT/" + filename) clauses = formula.clauses[:] nv = formula.nv original_time = time.time() original_solution = solve_clauses(clauses, solver) result += "|| original: {} || Tiempo: {:.10f} segundos ".format(original_solution, time.time() - original_time) clauses, nv = sat_to_3_sat(clauses, nv) if sat > 3: x_sat = 3 while x_sat < sat: clauses, nv = reduce_to_x_sat(clauses, nv) x_sat += 1 x_sat_time = time.time() x_sat_solution = solve_clauses(clauses, solver) result += "|| {}-SAT: {} || Tiempo: {:.10f} segundos ".format(sat, x_sat_solution, time.time() - x_sat_time) formula.clauses = clauses formula.nv = nv formula.to_file("./X-SAT/" + filename) result += "|| Tiempo total: {:.10f} segundos".format(time.time() - start_time) print(result)
def get_sat_problem(name): path = PATH+'sat_problems/'+name+".tar.gz" tar = tarfile.open(path) f = tar.extractfile(random.choice(tar.getmembers())) content = f.read() formula = CNF(from_string=content.decode("utf-8")) formula.clauses = formula.clauses[:-2] return formula
def solve_problem(problem): p_atoms, last = enumerate_states(problem, 1) a_atoms, last = enumerate_agent_actions(last, problem) spa_atoms, last = enumerate_spread_actions(problem, last) agea_atoms, last = enumerate_states(problem, last) noopa_atoms, last = enumerate_states(problem, last) observation_clauses = gen_observation_clauses(p_atoms, problem['observations']) action_preconditions_clauses = gen_precondition_clauses( p_atoms, a_atoms, spa_atoms, noopa_atoms, agea_atoms) fact_acheivement_clauses = gen_fact_acheivement_clauses( p_atoms, a_atoms, spa_atoms, noopa_atoms, agea_atoms) action_interefernce_clauses = gen_action_interefernce_clauses( a_atoms, spa_atoms, noopa_atoms, agea_atoms) must_spread_clauses = gen_must_spread_clauses(p_atoms, a_atoms, spa_atoms) must_age_clauses = gen_must_age_clauses(p_atoms, a_atoms, agea_atoms) S_representation_clauses = gen_S_representation_clauses(p_atoms) must_use_teams_clauses = gen_must_use_teams_clauses( p_atoms, a_atoms, problem['medics'], problem['police']) limited_teams_clauses = gen_limited_teams_clauses(p_atoms, a_atoms, problem['medics'], problem['police']) all_clauses = observation_clauses + action_preconditions_clauses + fact_acheivement_clauses + action_interefernce_clauses + must_spread_clauses + must_age_clauses + S_representation_clauses + must_use_teams_clauses + limited_teams_clauses answer = {} non_starter_list = ['I', 'Q'] for query in problem['queries']: row = query[0][0] col = query[0][1] step = query[1] status = query[2] if step == 0 and status in non_starter_list: answer[ query] = 'F' # a query about a state that can't be in step 0 returns 'F' instantly else: if status == 'S': query_clause = [ p_atoms['S3'][step][row][col], p_atoms['S2'][step][row][col], p_atoms['S1'][step][row][col] ] elif status == 'Q': if step == 0: # can't have Q in initial conditions query_clause = [False] else: query_clause = [ p_atoms['Q2'][step][row][col], p_atoms['Q1'][step][row][col] ] elif status == 'I': if step == 0: # can't have I in initial conditions query_clause = [False] else: query_clause = [p_atoms['I'][step][row][col]] else: query_clause = [p_atoms[status][step][row][col]] cnf_formula1 = CNF() sat_solver = Solver() cnf_formula1.clauses = all_clauses + [query_clause] #cnf_formula.clauses = all_clauses + [[21, 29, 37]] sat_solver.append_formula(cnf_formula1) res1 = sat_solver.solve() #res2 = sat_solver.get_model() sat_solver.delete() res1_other = False if res1 == True: # try to solve again- with any otehr possible status instead of status # If there is a solution- then it means there could be another status # It this case the result can;t be conclusive sat_solver = Solver() negative_query_clauses = [] for q in query_clause: negative_query_clauses.append([-q]) cnf_formula2 = CNF() cnf_formula2.clauses = all_clauses + negative_query_clauses sat_solver.append_formula(cnf_formula2) res1_other = sat_solver.solve() model = sat_solver.get_model() sat_solver.delete() if res1 and not res1_other: # The query status is possible and no other status is possible answer[query] = 'T' elif res1 and res1_other: # The query status is possible but also at least one more status can be answer[query] = '?' else: answer[query] = 'F' # The query status is not possible sat_solver.delete() return answer