Beispiel #1
0
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)
Beispiel #2
0
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
Beispiel #3
0
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