mirror of
				https://github.com/Z3Prover/z3
				synced 2025-10-31 03:32:28 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			69 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*++
 | |
| 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); }
 | |
|     };
 | |
| };
 | |
| 
 |