PolyBoRi
|
00001 // -*- c++ -*- 00002 //***************************************************************************** 00015 //***************************************************************************** 00016 00017 #ifndef polybori_BoolePolyRing_h_ 00018 #define polybori_BoolePolyRing_h_ 00019 00020 // load PolyBoRi settings 00021 # include <polybori/pbori_defs.h> 00022 00023 // include basic decision diagram manager interface 00024 #include "ring/CCuddCore.h" 00025 #include "except/PBoRiError.h" 00026 #include "common/CCheckedIdx.h" 00027 #include <boost/intrusive_ptr.hpp> 00028 #include "common/CWeakPtr.h" 00029 #include <list> 00030 00031 BEGIN_NAMESPACE_PBORI 00032 00033 class WeakRingPtr; // forward declaration 00034 00040 class BoolePolyRing: 00041 public CTypes::orderenums_type, public CTypes::compenums_type, 00042 public CTypes::auxtypes_type { 00043 00045 typedef BoolePolyRing self; 00046 00047 public: 00048 00050 friend class WeakRingPtr; 00051 00053 typedef class BooleExponent exp_type; 00054 00056 typedef class BooleMonomial monom_type; 00057 00059 typedef class BooleVariable var_type; 00060 00062 typedef class BooleSet dd_type; 00063 00065 typedef class BoolePolynomial poly_type; 00067 00068 typedef CTypes::ordercode_type ordercode_type; 00069 typedef CTypes::vartext_type vartext_type; 00071 00073 typedef CCheckedIdx checked_idx_type; 00074 00076 typedef CCuddCore core_type; 00077 typedef core_type::const_varname_reference const_varname_reference; 00079 typedef boost::intrusive_ptr<core_type> core_ptr; 00080 00082 typedef core_type::order_type order_type; 00083 00085 typedef core_type::order_ptr order_ptr; 00086 00088 typedef order_type& order_reference; 00089 00090 typedef DdManager mgr_type; 00092 using CTypes::orderenums_type::ordercodes; 00093 00095 typedef std::vector<idx_type> block_idx_type; 00096 00098 typedef block_idx_type::const_iterator block_iterator; 00099 00100 protected: 00101 00104 BoolePolyRing(const core_ptr& rhs): p_core(rhs) {} 00105 00107 explicit BoolePolyRing(const CWeakPtr<core_type>& rhs): 00108 p_core(rhs.operator->()) { PBORI_ASSERT(p_core != NULL); } 00109 00110 public: 00112 explicit BoolePolyRing(size_type nvars = 1, 00113 ordercode_type order = lp); 00114 00116 BoolePolyRing(size_type nvars, const order_ptr& order): 00117 p_core(new core_type(nvars, order)) {} 00118 00120 BoolePolyRing(const self& rhs): p_core(rhs.p_core) {} 00121 00123 ~BoolePolyRing() {} 00124 00126 size_type nVariables() const { return p_core->m_mgr.nVariables(); } 00127 00129 vartext_type getVariableName(checked_idx_type idx) const { 00130 return p_core->m_names[idx]; 00131 } 00132 00134 void setVariableName(checked_idx_type idx, vartext_type varname) { 00135 p_core->m_names.set(idx, varname); 00136 } 00137 00139 void clearCache() { p_core->m_mgr.cacheFlush(); } 00140 00142 ostream_type& print(ostream_type&) const; 00143 00145 hash_type hash() const { 00146 return static_cast<hash_type>(reinterpret_cast<std::ptrdiff_t 00147 >(getManager())); 00148 } 00149 00151 hash_type id() const { 00152 return static_cast<hash_type>(reinterpret_cast<std::ptrdiff_t>(p_core.operator->())); 00153 } 00154 00156 order_reference ordering() const { return *(p_core->pOrder); } 00157 00159 mgr_type* getManager() const { return p_core->m_mgr.getManager(); } 00160 00162 self clone() const { return self(core_ptr(new core_type(*p_core))); } 00163 00165 void changeOrdering(ordercode_type); 00166 00168 poly_type coerce(const poly_type& rhs) const; 00169 00171 monom_type coerce(const monom_type& rhs) const; 00172 00174 var_type coerce(const var_type& rhs) const; 00175 00177 dd_type variableDiagram(checked_idx_type nvar) const; 00178 00180 var_type variable(checked_idx_type nvar) const; 00181 00183 dd_type zero() const; 00184 00186 dd_type one() const; 00187 00189 dd_type constant(bool is_one) const; 00190 00191 protected: 00193 core_ptr core() const { return p_core; }; 00194 00196 core_ptr p_core; 00197 }; 00198 00200 inline BoolePolyRing::ostream_type& 00201 operator<<(BoolePolyRing::ostream_type& os, const BoolePolyRing& ring) { 00202 return ring.print(os); 00203 } 00204 00205 END_NAMESPACE_PBORI 00206 00207 00208 #endif // of #ifndef polybori_BoolePolyRing_h_