def _search_solver_helper(self, sent, symbols): m = sent.implicit_model() unassigned_symbols = sorted(symbols - m.keys()) # TODO: different orders if len(unassigned_symbols) == 0: if sent.check_model(m): return m else: return None else: next_symbol = unassigned_symbols[0] negative_unit_clause = Clause([Literal(next_symbol, polarity=False)]) closure = limited_unit_resolution_closure(negative_unit_clause, sent.clauses) if cnf.c('FALSE') not in closure: sat_if_false = self._search_solver_helper(Cnf(closure), symbols) if sat_if_false != None: # early termination if already satisfied return sat_if_false positive_unit_clause = Clause([Literal(next_symbol, polarity=True)]) closure = limited_unit_resolution_closure(positive_unit_clause, sent.clauses) if cnf.c('FALSE') not in closure: sat_if_true = self._search_solver_helper(Cnf(closure), symbols) return sat_if_true else: return None
def _search_solver_helper(self, sent, symbols): def assign(model_so_far, symbol, bool_assignment): if bool_assignment: assignment = 1 else: assignment = -1 return {**model_so_far, symbol: assignment} self.visited += 1 if sent is None: return None m = sent.current_assignment() unassigned_symbols = sorted(symbols - m.keys()) # TODO: different orders if len(unassigned_symbols) == 0: if sent.check_term(m): return m else: return None else: next_symbol = unassigned_symbols[0] positive_unit_clause = Clause([Literal(next_symbol, neg=False)]) new_clauses = unit_resolution(positive_unit_clause, sent) sat_if_true = self._search_solver_helper(new_clauses, symbols) if sat_if_true != None: # early termination if already satisfied return sat_if_true negative_unit_clause = Clause([Literal(next_symbol, neg=True)]) new_clauses = unit_resolution(negative_unit_clause, sent) sat_if_false = self._search_solver_helper(new_clauses, symbols) return sat_if_false
def _max_one_color(self, cnf): for country in self.G.nodes(): for color_combos in combinations(self.colors, 2): clause = Clause() clause.add_literal( -self._convert_to_literal(country, color_combos[0]) ) clause.add_literal( -self._convert_to_literal(country, color_combos[1]) ) clause.end() cnf.add_clause(clause)
def _at_leat_one_color(self, cnf): for country in self.G.nodes(): clause = Clause() for color in self.colors: literal = self._convert_to_literal(country, color) clause.add_literal(literal) clause.end() cnf.add_clause(clause)
def generate_random_clause(k, N): variables = choose(N, k) literals = [] for var in variables: neg = random.choice([True, False]) literal = Literal(str(var), neg) literals.append(literal) return Clause(literals)
def _max_one_color(self, cnf): for country in self.G.nodes(): for color_combos in combinations(self.colors, 2): clause = Clause() clause.add_literal( -self._convert_to_literal(country, color_combos[0])) clause.add_literal( -self._convert_to_literal(country, color_combos[1])) clause.end() cnf.add_clause(clause)
def _different_colors(self, cnf): for country in self.G.nodes(): for neighbor in self.G.neighbors(country): for color in self.colors: clause = Clause() clause.add_literal( -self._convert_to_literal(country, color)) clause.add_literal( -self._convert_to_literal(neighbor, color)) clause.end() cnf.add_clause(clause)
def _search_solver_helper(self, sent, symbols): m = sent.implicit_model() unassigned_symbols = sorted(symbols - m.keys()) if len(unassigned_symbols) == 0: if sent.check_model(m): return m, [m] else: return None, [m] else: next_symbol = unassigned_symbols[0] negative_unit_clause = Clause([Literal(next_symbol, polarity=False)]) sent_if_false = Cnf(sent.clauses | { negative_unit_clause }) sat_if_false, models_if_false = self._search_solver_helper(sent_if_false, symbols) if sat_if_false != None: # early termination if already satisfied return sat_if_false, models_if_false positive_unit_clause = Clause([Literal(next_symbol, polarity=True)]) sent_if_true = Cnf(sent.clauses | { positive_unit_clause }) sat_if_true, models_if_true = self._search_solver_helper(sent_if_true, symbols) return sat_if_true, models_if_false + models_if_true
def _different_colors(self, cnf): for country in self.G.nodes(): for neighbor in self.G.neighbors(country): for color in self.colors: clause = Clause() clause.add_literal( -self._convert_to_literal(country, color) ) clause.add_literal( -self._convert_to_literal(neighbor, color) ) clause.end() cnf.add_clause(clause)