def simplify(cnf_file, output_file, num_var_not_fixed, rng):
    sol = solve_weighted_max_sat_file(cnf_file, [], 1)
    int_sol = []
    for i, val in enumerate(sol[0]):
        if val:
            int_sol.append(i + 1)
        else:
            int_sol.append(-(i + 1))
    sol = rng.choice(int_sol,
                     size=len(int_sol) - num_var_not_fixed,
                     replace=False)
    output_file += ".wcnf"
    fix_var(cnf_file, output_file, sol)
    wcnf = WCNF(output_file)
    wcnf.to_file(output_file)
    return cnf_to_model(output_file, rng)
예제 #2
0
def generate_wcnfs(path, models_and_contexts):

    for i, elem in enumerate(models_and_contexts):
        model = elem["model"]
        contexts = elem["contexts"]

        wcnf = WCNF()
        for weight_clause in model:
            if weight_clause[0] == None:
                wcnf.append(tuple(weight_clause[1]))
            else:
                wcnf.append(tuple(weight_clause[1]), weight=weight_clause[0])
        wcnf.to_file(path + f"_{i}.wcnf")

        for j, context in enumerate(contexts):
            wcnf_context = wcnf.copy()
            #            print(context)
            for literals in context:
                wcnf_context.append((literals,))
            wcnf_context.to_file(path + f"_{i}_context_{j}.wcnf")