00001
00002
00070
00071
00072
00073 #include "pbori_defs.h"
00074
00075 #include "BooleEnv.h"
00076
00077 #include "CCacheManagement.h"
00078
00079 #ifndef CDegreeCache_h_
00080 #define CDegreeCache_h_
00081
00082 BEGIN_NAMESPACE_PBORI
00083
00090 template <class NaviType>
00091 class CIndexHandle {
00092 public:
00093
00094 enum { invalid = CTypes::max_idx };
00095
00097 typedef NaviType navigator;
00098
00100 typedef navigator base;
00101
00103 typedef typename navigator::bool_type bool_type;
00104
00106 typedef typename CTypes::idx_type idx_type;
00107
00109 typedef typename CTypes::size_type size_type;
00110
00112 typedef typename CTypes::manager_base manager_type;
00113
00115 CIndexHandle(idx_type idx): m_idx(idx) {}
00116
00118 explicit CIndexHandle(navigator navi, const manager_type& mgr):
00119 m_idx(fromNode(navi, mgr)) {}
00120
00122 idx_type operator*() const {
00123 return m_idx;
00124 }
00125
00126 bool isValid() const {
00127 return (m_idx != invalid);
00128 }
00129 protected:
00131 idx_type fromNode(navigator navi, const manager_type& mgr) const {
00132
00133 if (!navi.isValid())
00134 return invalid;
00135
00136 if UNLIKELY(navi.isConstant())
00137 return mgr.nVariables();
00138 else
00139 return *navi;
00140 }
00141
00142
00143
00144 idx_type m_idx;
00145 };
00146
00147
00148 template <class NaviType>
00149 class CIndexCacheHandle {
00150 public:
00151
00153 typedef NaviType navigator;
00154
00156
00157
00159 typedef typename navigator::bool_type bool_type;
00160
00162 typedef typename navigator::value_type idx_type;
00163
00165 typedef typename navigator::size_type size_type;
00166
00168 typedef typename CTypes::manager_base manager_type;
00169
00171 CIndexCacheHandle(idx_type idx, const manager_type& mgr):
00172 m_navi( toNode(idx, mgr) ) {}
00173
00175 explicit CIndexCacheHandle(navigator navi):
00176 m_navi(navi) {}
00177
00178 operator navigator() const { return m_navi; }
00179
00180 protected:
00182 navigator toNode(idx_type idx, const manager_type& mgr) const {
00183
00184 if LIKELY((size_type)idx < mgr.nVariables())
00185 return navigator(mgr.getVar(idx));
00186
00187 return navigator(mgr.zddZero());
00188 }
00189
00191 navigator m_navi;
00192 };
00193
00194 template <class TagType = typename CCacheTypes::degree,
00195 class DDType = typename CTypes::dd_type>
00196 class CDegreeCache:
00197 public CCacheManagement<TagType, 1> {
00198
00199 public:
00201
00202 typedef DDType dd_type;
00203 typedef TagType tag_type;
00204 typedef CCacheManagement<tag_type, 1> base;
00205 typedef CDegreeCache<tag_type, dd_type> self;
00207
00209
00210 typedef typename base::node_type input_node_type;
00211 typedef typename base::manager_type manager_type;
00212 typedef typename dd_type::size_type size_type;
00213 typedef typename dd_type::deg_type deg_type;
00214 typedef typename dd_type::navigator navi_type;
00215 typedef CIndexHandle<navi_type> node_type;
00216 typedef CIndexCacheHandle<navi_type> node_cache_type;
00218
00220 CDegreeCache(const manager_type& mgr): base(mgr) {}
00221
00223 CDegreeCache(const self& rhs): base(rhs) {}
00224
00226 ~CDegreeCache() {}
00227
00229 node_type find(input_node_type navi) const{
00230 return node_type(base::find(navi), base::manager()); }
00231
00232 node_type find(navi_type navi) const{
00233 return node_type(base::find(navi), base::manager()); }
00234
00236 void insert(input_node_type navi, deg_type deg) const {
00237 base::insert(navi, node_cache_type(deg, base::manager()));
00238 }
00239
00241 void insert(navi_type navi, deg_type deg) const {
00242 base::insert(navi, node_cache_type(deg, base::manager()));
00243 }
00244
00245 };
00246
00247
00248
00249
00250 template <class TagType = typename CCacheTypes::block_degree,
00251 class DDType = typename CTypes::dd_type>
00252 class CBlockDegreeCache:
00253 public CCacheManagement<TagType, 2> {
00254
00255 public:
00257
00258 typedef DDType dd_type;
00259 typedef TagType tag_type;
00260 typedef CCacheManagement<tag_type, 2> base;
00261 typedef CBlockDegreeCache<tag_type, dd_type> self;
00263
00265
00266 typedef typename base::node_type input_node_type;
00267 typedef typename base::manager_type manager_type;
00268 typedef typename dd_type::idx_type idx_type;
00269 typedef typename dd_type::size_type size_type;
00270 typedef typename dd_type::navigator navi_type;
00271 typedef CIndexHandle<navi_type> node_type;
00272 typedef CIndexCacheHandle<navi_type> node_cache_type;
00274
00276 CBlockDegreeCache(const manager_type& mgr): base(mgr) {}
00277
00279 CBlockDegreeCache(const self& rhs): base(rhs) {}
00280
00282 ~CBlockDegreeCache() {}
00283
00285 node_type find(input_node_type navi, idx_type idx) const{
00286 return node_type(base::find(navi, node_cache_type(idx, base::manager())),
00287 base::manager()); }
00288
00289 node_type find(navi_type navi, idx_type idx) const{
00290 return node_type(base::find(navi, node_cache_type(idx, base::manager())),
00291 base::manager()); }
00292
00294 void insert(input_node_type navi, idx_type idx, size_type deg) const {
00295 base::insert(navi, node_cache_type(idx, base::manager()),
00296 node_cache_type(deg, base::manager()));
00297 }
00298
00300 void insert(navi_type navi, idx_type idx, size_type deg) const {
00301 base::insert(navi, node_cache_type(idx, base::manager()),
00302 node_cache_type(deg, base::manager()));
00303 }
00304 };
00305
00306 template <class TagType,
00307 class DDType = typename CTypes::dd_type>
00308 class CDegreeArgumentCache:
00309 public CCacheManagement<TagType, 2> {
00310
00311 public:
00313
00314 typedef DDType dd_type;
00315 typedef TagType tag_type;
00316 typedef CCacheManagement<tag_type, 2> base;
00317 typedef CDegreeArgumentCache<tag_type, dd_type> self;
00319
00321
00322 typedef typename base::node_type node_type;
00323 typedef typename base::manager_type manager_type;
00324 typedef typename dd_type::size_type size_type;
00325 typedef typename dd_type::navigator navi_type;
00326 typedef CIndexCacheHandle<navi_type> degree_node_type;
00328
00330 CDegreeArgumentCache(const manager_type& mgr): base(mgr) {}
00331
00333 CDegreeArgumentCache(const self& rhs): base(rhs) {}
00334
00336 ~CDegreeArgumentCache() {}
00337
00339 navi_type find(navi_type navi, size_type deg) const{
00340 return base::find(navi, degree_node_type(deg, base::manager()));
00341 }
00342
00344 void insert(navi_type navi, size_type deg, navi_type result) const {
00345 base::insert(navi, degree_node_type(deg, base::manager()), result);
00346 }
00347
00348 };
00349
00350
00351 END_NAMESPACE_PBORI
00352
00353 #endif