1#ifndef _congruenc_hpp_INCLUDED
2#define _congruenc_hpp_INCLUDED
14#include <unordered_set>
73#define LD_MAX_ARITY 26
74#define MAX_ARITY ((1 << LD_MAX_ARITY) - 1)
429 const std::vector<LRAT_ID> & = {},
430 const std::vector<LRAT_ID> & = {});
432 const std::vector<LRAT_ID> & = {},
433 const std::vector<LRAT_ID> & = {});
445 std::vector<LRAT_ID> &
chain,
449 int except_lhs2 = 0);
451 std::vector<LRAT_ID> &
chain,
455 int except_lhs2 = 0);
460 const std::vector<LitClausePair> &c);
464 Gate *g,
Gate *h, std::vector<LRAT_ID> &extra_reasons_lit,
465 std::vector<LRAT_ID> &extra_reasons_ulit,
bool remove_units =
true);
468 std::vector<LRAT_ID> &extra_reasons_lit,
469 std::vector<LRAT_ID> &extra_reasons_ulit);
500 int except2 = 0,
bool flip = 0);
534 Gate *except =
nullptr);
572 int lit, lit_implications::const_iterator begin,
573 lit_implications::const_iterator end);
575 lit_implications::const_iterator pos_begin,
576 lit_implications::const_iterator pos_end,
int neg_lit,
577 lit_implications::const_iterator neg_begin,
578 lit_implications::const_iterator neg_end,
588 std::vector<LRAT_ID> &reasons1,
589 std::vector<LRAT_ID> &reasons2);
593 std::vector<LitClausePair> &&clauses);
612 int falsified,
int unit);
632 bool remove_units =
true,
bool =
true);
640 std::vector<LitClausePair> &litIds,
int except_lhs,
641 size_t &old_position1,
size_t &old_position2,
642 bool remove_units =
true);
677 int except2 = 0,
bool flip = 0);
679 int except2 = 0,
bool flip = 0);
684 size_t d,
int cond_lit_to_learn_if_degenerated);
686 Gate *g,
int dst,
int src, std::vector<LRAT_ID> &reasons_implication,
687 std::vector<LRAT_ID> &reasons_back);
689 Gate *g, std::vector<LRAT_ID> &reasons_implication,
690 std::vector<LRAT_ID> &reasons_back,
691 std::vector<LRAT_ID> &reasons_unit,
bool,
bool &);
696 Gate *g,
Gate *h, std::vector<LRAT_ID> &reasons_lrat,
697 std::vector<LRAT_ID> &reasons_lrat_back,
bool remove_units =
true);
704 std::vector<LRAT_ID> &reasons_implication,
705 std::vector<LRAT_ID> &reasons_back);
707 Gate *g, std::vector<LRAT_ID> &reasons_implication,
708 std::vector<LRAT_ID> &reasons_back,
size_t idx1,
size_t idx2);
711 Gate *g, std::vector<LRAT_ID> &reasons_lrat,
712 std::vector<LRAT_ID> &reasons_back_lrat,
size_t idx1,
size_t idx2);
#define ABC_NAMESPACE_CXX_HEADER_START
#define ABC_NAMESPACE_CXX_HEADER_END
#define CADICAL_assert(ignore)
#define add_ite_matching_proof_chain(...)
#define check_and_gate_implied(...)
#define add_xor_shrinking_proof_chain(...)
#define add_ite_turned_and_binary_clauses
#define check_ite_implied
#define add_xor_matching_proof_chain(...)
#define check_ite_gate_implied
#define check_xor_gate_implied
bool ite_flags_neg_cond_lhs(int8_t flag)
bool ite_flags_cond_lhs(int8_t flag)
std::vector< lit_equivalence > lit_equivalences
std::vector< lit_implication > lit_implications
bool ite_flags_no_then_clauses(int8_t flag)
bool ite_flags_no_else_clauses(int8_t flag)
std::string string_of_gate(Gate_Type t)
ClauseSize(int s, Clause *c)
vector< LRAT_ID > eager_representant_id
LRAT_ID & representative_id(int lit)
void simplify_ite_gate_condition_set(Gate *g, std::vector< LRAT_ID > &reasons_lrat, std::vector< LRAT_ID > &reasons_back_lrat, size_t idx1, size_t idx2)
void reset_ite_gate_extraction()
Gate * find_xor_gate(Gate *)
void produce_representative_lrat(int lit)
int find_eager_representative(int)
vector< LRAT_ID > lrat_chain
void simplify_xor_gate(Gate *g)
void search_condeq(int lit, int pos_lit, lit_implications::const_iterator pos_begin, lit_implications::const_iterator pos_end, int neg_lit, lit_implications::const_iterator neg_begin, lit_implications::const_iterator neg_end, lit_equivalences &condeq)
Gate * find_ite_gate(Gate *, bool &)
void merge_condeq(int cond, lit_equivalences &condeq, lit_equivalences ¬_condeq)
bool simplify_ite_gate_to_and(Gate *g, size_t idx1, size_t idx2, int removed)
vector< int > unsimplified
bool propagate_unit(int lit)
Gate * new_xor_gate(const vector< LitClausePair > &, int)
vector< LitClausePair > lrat_chain_and_gate
bool rewriting_lhs(Gate *g, int dst)
Gate * find_and_lits(const vector< int > &rhs, Gate *except=nullptr)
void simplify_and_gate(Gate *g)
void simplify_unit_xor_lrat_clauses(const vector< LitClausePair > &, int)
Clause * learn_binary_tmp_or_full_clause(int a, int b)
Clause * add_tmp_binary_clause(int a, int b)
LRAT_ID find_eager_representative_lrat(int lit)
int & representative(int lit)
void extract_ite_gates_of_variable(int idx)
void set_mu4_reason(int lit, Clause *c)
void set_mu2_reason(int lit, Clause *c)
LRAT_ID simplify_and_add_to_proof_chain(vector< int > &unsimplified, LRAT_ID delete_id=0)
void produce_eager_representative_lrat(int lit)
void merge_ite_gate_same_then_else_lrat(std::vector< LitClausePair > &clauses, std::vector< LRAT_ID > &reasons_implication, std::vector< LRAT_ID > &reasons_back)
Clause * find_large_xor_side_clause(std::vector< int > &lits)
void push_id_and_rewriting_lrat_unit(Clause *c, Rewrite rewrite1, std::vector< LRAT_ID > &chain, bool=true, Rewrite rewrite2=Rewrite(), int execept_lhs=0, int except_lhs2=0)
unordered_set< Gate *, Hash, GateEqualTo > GatesTable
void compute_rewritten_clause_lrat_simple(Clause *c, int except)
void init_xor_gate_extraction(std::vector< Clause * > &candidates)
vector< int > representant
void check_binary_implied(int a, int b)
Clause * simplify_xor_clause(int lhs, Clause *)
bool skip_and_gate(Gate *g)
char & lazy_propagated(int lit)
void push_id_on_chain(std::vector< LRAT_ID > &chain, Clause *c)
void push_lrat_unit(int lit)
void push_id_and_rewriting_lrat_full(Clause *c, Rewrite rewrite1, std::vector< LRAT_ID > &chain, bool=true, Rewrite rewrite2=Rewrite(), int execept_lhs=0, int except_lhs2=0)
void merge_and_gate_lrat_produce_lrat(Gate *g, Gate *h, std::vector< LRAT_ID > &reasons_lrat, std::vector< LRAT_ID > &reasons_lrat_back, bool remove_units=true)
uint64_t & new_largecounts(int lit)
std::array< lit_equivalences, 2 > condeq
void rewrite_xor_gate(Gate *g, int dst, int src)
void update_and_gate_unit_build_lrat_chain(Gate *g, int src, LRAT_ID id1, LRAT_ID id2, int dst, std::vector< LRAT_ID > &extra_reasons_lit, std::vector< LRAT_ID > &extra_reasons_ulit)
void shrink_and_gate(Gate *g, int falsified=0, int clashing=0)
bool rewrite_gates(int dst, int src, LRAT_ID id1, LRAT_ID id2)
std::array< int, 16 > nonces
vector< uint64_t > glargecounts
int find_representative_and_compress(int, bool update_eager=true)
bool normalize_ite_lits_gate(Gate *rhs)
void produce_ite_merge_lhs_then_else_reasons(Gate *g, std::vector< LRAT_ID > &reasons_implication, std::vector< LRAT_ID > &reasons_back, std::vector< LRAT_ID > &reasons_unit, bool, bool &)
void extract_xor_gates_with_base_clause(Clause *c)
void import_lazy_and_find_eager_representative_and_compress_both(int)
Gate * find_first_and_gate(Clause *base_clause, int lhs)
void learn_congruence_unit_when_lhs_set(Gate *g, int src, LRAT_ID id1, LRAT_ID id2, int dst)
uint32_t number_from_xor_reason(const std::vector< int > &rhs, int, int except2=0, bool flip=0)
std::array< lit_implications, 2 > condbin
void check_contained_module_rewriting(Clause *c, int lit, bool, int except)
LRAT_ID & eager_representative_id(int lit)
vector< signed char > marks
vector< int > eager_representant
void update_and_gate(Gate *g, GatesTable::iterator, int src, int dst, LRAT_ID id1, LRAT_ID id2, int falsified=0, int clashing=0)
int find_lrat_representative_with_marks(int lit)
LitClausePair marked_mu1(int lit)
void produce_rewritten_clause_lrat(vector< LitClausePair > &, int execept_lhs=0, bool=true)
Clause * maybe_add_binary_clause(int a, int b)
void init_and_gate_extraction()
vector< CompactBinary > binaries
bool learn_congruence_unit(int unit, bool=false, bool=false)
void learn_congruence_unit_falsifies_lrat_chain(Gate *g, int src, int dst, int clashing, int falsified, int unit)
bool rewrite_gate(Gate *g, int dst, int src, LRAT_ID id1, LRAT_ID id2)
void init_ite_gate_extraction(std::vector< ClauseSize > &candidates)
vector< Clause * > extra_clauses
vector< LRAT_ID > representant_id
void sort_literals_by_var(vector< int > &rhs)
void reset_xor_gate_extraction()
void extract_and_gates(Closure &)
bool merge_literals_lrat(Gate *g, Gate *h, int lit, int other, const std::vector< LRAT_ID > &={}, const std::vector< LRAT_ID > &={})
bool find_binary(int, int) const
void check_not_tmp_binary_clause(Clause *c)
vector< int > resolvent_analyzed
void simplify_ite_gate_produce_unit_lrat(Gate *g, int lit, size_t idx1, size_t idx2)
int find_eager_representative_and_compress(int)
void produce_rewritten_clause_lrat_and_clean(vector< LitClausePair > &, int execept_lhs=0, bool=true)
uint64_t & largecount(int lit)
void forward_subsume_matching_clauses()
bool merge_literals_equivalence(int lit, int other, Clause *c1, Clause *c2)
void rewrite_ite_gate_update_lrat_reasons(Gate *g, int src, int dst)
Gate * new_ite_gate(int lhs, int cond, int then_lit, int else_lit, std::vector< LitClausePair > &&clauses)
void rewrite_ite_gate(Gate *g, int dst, int src)
void update_and_gate_build_lrat_chain(Gate *g, Gate *h, std::vector< LRAT_ID > &extra_reasons_lit, std::vector< LRAT_ID > &extra_reasons_ulit, bool remove_units=true)
int & eager_representative(int lit)
void push_lrat_id(const Clause *const c, int lit)
lit_implications::const_iterator find_lit_implication_second_literal(int lit, lit_implications::const_iterator begin, lit_implications::const_iterator end)
void check_ite_lrat_reasons(Gate *g, bool=false)
void simplify_ite_gate(Gate *g)
bool rewrite_ite_gate_to_and(Gate *g, int dst, int src, size_t c, size_t d, int cond_lit_to_learn_if_degenerated)
void reset_and_gate_extraction()
uint64_t & largecounts(int lit)
void rewrite_and_gate(Gate *g, int dst, int src, LRAT_ID id1, LRAT_ID id2)
void promote_clause(Clause *)
LitClausePair marked_mu2(int lit)
LRAT_ID check_and_add_to_proof_chain(vector< int > &clause)
uint32_t number_from_xor_reason_reversed(const std::vector< int > &rhs)
bool skip_xor_gate(Gate *g)
void add_clause_to_chain(std::vector< int >, LRAT_ID)
Clause * maybe_promote_tmp_binary_clause(Clause *)
void extract_congruence()
void simplify_and_sort_xor_lrat_clauses(const vector< LitClausePair > &, vector< LitClausePair > &, int, int except2=0, bool flip=0)
vector< uint64_t > gnew_largecounts
void schedule_literal(int lit)
int find_representative(int lit)
void extract_ite_gates_of_literal(int)
bool simplify_gates(int lit)
void produce_ite_merge_then_else_reasons(Gate *g, int dst, int src, std::vector< LRAT_ID > &reasons_implication, std::vector< LRAT_ID > &reasons_back)
LitClausePair marked_mu4(int lit)
bool find_subsuming_clause(Clause *c)
void find_conditional_equivalences(int lit, lit_implications &condbin, lit_equivalences &condeq)
std::vector< std::pair< size_t, size_t > > offsetsize
std::vector< char > lazy_propagated_idx
void mark_garbage(Gate *)
size_t propagate_units_and_equivalences()
void gate_sort_lrat_reasons(std::vector< LitClausePair > &, int, int except2=0, bool flip=0)
void update_xor_gate(Gate *g, GatesTable::iterator)
void connect_goccs(Gate *g, int lit)
Clause * add_binary_clause(int a, int b)
void subsume_clause(Clause *subsuming, Clause *subsumed)
void sort_literals_by_var_except(vector< int > &rhs, int, int except2=0)
LRAT_ID find_representative_lrat(int lit)
Gate * find_gate_lits(const vector< int > &rhs, Gate_Type typ, Gate *except=nullptr)
Gate * new_and_gate(Clause *, int)
void find_representative_and_compress_both(int)
vector< LitClausePair > mu2_ids
void delete_proof_chain()
Clause * new_tmp_clause(std::vector< int > &clause)
void simplify_ite_gate_then_else_set(Gate *g, std::vector< LRAT_ID > &reasons_implication, std::vector< LRAT_ID > &reasons_back, size_t idx1, size_t idx2)
bool simplify_gate(Gate *g)
bool propagate_equivalence(int lit)
std::vector< Clause * > new_unwatched_binary_clauses
void set_mu1_reason(int lit, Clause *c)
Clause * produce_rewritten_clause_lrat(Clause *c, int execept_lhs=0, bool remove_units=true, bool=true)
signed char & marked(int lit)
void copy_conditional_equivalences(int lit, lit_implications &condbin)
vector< LitClausePair > mu1_ids
void extract_and_gates_with_base_clause(Clause *c)
vector< LitClausePair > mu4_ids
Gate * find_remaining_and_gate(Clause *base_clause, int lhs)
void extract_condeq_pairs(int lit, lit_implications &condbin, lit_equivalences &condeq)
Gate * find_xor_lits(const vector< int > &rhs)
CompactBinary(Clause *c, LRAT_ID i, int l1, int l2)
bool operator()(const Gate *const lhs, const Gate *const rhs) const
bool operator==(Gate const &lhs)
vector< LitClausePair > pos_lhs_ids
vector< LitClausePair > neg_lhs_ids
size_t operator()(const Gate *const g) const
Hash(std::array< int, 16 > &ncs)
std::array< int, 16 > & nonces
LitClausePair(int lit, Clause *cl)
LitIdPair(int l, LRAT_ID i)
Rewrite(int _src, int _dst, LRAT_ID _id1, LRAT_ID _id2)
lit_equivalence(int f, Clause *f_id, int s, Clause *s_id)
lit_equivalence negate_both()
lit_equivalence(int f, int s)
lit_implication(int f, int s)
lit_implication(int f, int s, Clause *_id)
Type operator()(const ClauseSize &a)