/*++ Copyright (c) 2011 Microsoft Corporation Module Name: sat_scc.h Abstract: Use binary clauses to compute strongly connected components. Author: Leonardo de Moura (leonardo) 2011-05-26. Revision History: --*/ #pragma once #include "util/statistics.h" #include "util/params.h" #include "sat/sat_types.h" #include "sat/sat_big.h" namespace sat { class solver; class scc { struct report; solver & m_solver; // config bool m_scc; bool m_scc_tr; // stats unsigned m_num_elim; unsigned m_num_elim_bin; big m_big; void reduce_tr(); unsigned reduce_tr(bool learned); public: scc(solver & s, params_ref const & p); bool extract_roots(literal_vector& roots, bool_var_vector& lits); unsigned operator()(); void updt_params(params_ref const & p); static void collect_param_descrs(param_descrs & d); void collect_statistics(statistics & st) const; void reset_statistics(); /* \brief create binary implication graph and associated data-structures to check transitivity. */ void init_big(bool learned) { m_big.init(m_solver, learned); } void ensure_big(bool learned) { m_big.ensure_big(m_solver, learned); } int get_left(literal l) const { return m_big.get_left(l); } int get_right(literal l) const { return m_big.get_right(l); } bool connected(literal u, literal v) const { return m_big.connected(u, v); } }; };