PolyBoRi
CDegreeCache.h
Go to the documentation of this file.
1 // -*- c++ -*-
2 //*****************************************************************************
70 //*****************************************************************************
71 
72 // include basic definitions
73 #include "pbori_defs.h"
74 
75 #include "BooleEnv.h"
76 
77 #include "CCacheManagement.h"
78 
79 #ifndef CDegreeCache_h_
80 #define CDegreeCache_h_
81 
83 //class BoolePolyRing;
90 template <class NaviType>
91 class CIndexHandle {
92 public:
93 
94  enum { invalid = CTypes::max_idx };
95 
97  typedef NaviType navigator;
98 
100  typedef navigator base;
101 
103  typedef typename navigator::bool_type bool_type;
104 
106  typedef typename CTypes::idx_type idx_type;
107 
109  typedef typename CTypes::size_type size_type;
110 
113 
115  CIndexHandle(idx_type idx): m_idx(idx) {}
116 
118  explicit CIndexHandle(navigator navi, const manager_type& mgr):
119  m_idx(fromNode(navi, mgr)) {}
120 
122  idx_type operator*() const {
123  return m_idx;
124  }
125 
126  bool isValid() const {
127  return (m_idx != invalid);
128  }
129 protected:
131  idx_type fromNode(navigator navi, const manager_type& mgr) const {
132 
133  if (!navi.isValid())
134  return invalid;
135 
136  if UNLIKELY(navi.isConstant())
137  return mgr.nVariables();
138  else
139  return *navi;
140  }
141 
142 
143 
145 };
146 
147 
148 template <class NaviType>
150 public:
151 
153  typedef NaviType navigator;
154 
156  // typedef navigator base;
157 
159  typedef typename navigator::bool_type bool_type;
160 
162  typedef typename navigator::value_type idx_type;
163 
165  typedef typename navigator::size_type size_type;
166 
169 
172  m_navi( toNode(idx, mgr) ) {}
173 
175  explicit CIndexCacheHandle(navigator navi):
176  m_navi(navi) {}
177 
178  operator navigator() const { return m_navi; }
179 
180 protected:
182  navigator toNode(idx_type idx, const manager_type& mgr) const {
183 
184  if LIKELY((size_type)idx < mgr.nVariables())
185  return navigator(mgr.getVar(idx));
186 
187  return navigator(mgr.zddZero());
188  }
189 
192 };
193 
194 template <class TagType = typename CCacheTypes::degree,
195  class DDType = typename CTypes::dd_type>
197  public CCacheManagement<TagType, 1> {
198 
199 public:
201 
202  typedef DDType dd_type;
203  typedef TagType tag_type;
207 
209 
212  typedef typename dd_type::size_type size_type;
213  typedef typename dd_type::navigator navi_type;
217 
219  CDegreeCache(const manager_type& mgr): base(mgr) {}
220 
222  CDegreeCache(const self& rhs): base(rhs) {}
223 
226 
229  return node_type(base::find(navi), base::manager()); }
230 
231  node_type find(navi_type navi) const{
232  return node_type(base::find(navi), base::manager()); }
233 
235  void insert(input_node_type navi, size_type deg) const {
236  base::insert(navi, node_cache_type(deg, base::manager()));
237  }
238 
240  void insert(navi_type navi, size_type deg) const {
241  base::insert(navi, node_cache_type(deg, base::manager()));
242  }
243 
244 };
245 
246 
247 
248 
249 template <class TagType = typename CCacheTypes::block_degree,
250  class DDType = typename CTypes::dd_type>
252  public CCacheManagement<TagType, 2> {
253 
254 public:
256 
257  typedef DDType dd_type;
258  typedef TagType tag_type;
262 
264 
267  typedef typename dd_type::idx_type idx_type;
268  typedef typename dd_type::size_type size_type;
269  typedef typename dd_type::navigator navi_type;
273 
275  CBlockDegreeCache(const manager_type& mgr): base(mgr) {}
276 
278  CBlockDegreeCache(const self& rhs): base(rhs) {}
279 
282 
285  return node_type(base::find(navi, node_cache_type(idx, base::manager())),
286  base::manager()); }
287 
288  node_type find(navi_type navi, idx_type idx) const{
289  return node_type(base::find(navi, node_cache_type(idx, base::manager())),
290  base::manager()); }
291 
293  void insert(input_node_type navi, idx_type idx, size_type deg) const {
294  base::insert(navi, node_cache_type(idx, base::manager()),
295  node_cache_type(deg, base::manager()));
296  }
297 
299  void insert(navi_type navi, idx_type idx, size_type deg) const {
300  base::insert(navi, node_cache_type(idx, base::manager()),
301  node_cache_type(deg, base::manager()));
302  }
303 };
304 
305 template <class TagType,
306  class DDType = typename CTypes::dd_type>
308  public CCacheManagement<TagType, 2> {
309 
310 public:
312 
313  typedef DDType dd_type;
314  typedef TagType tag_type;
318 
320 
321  typedef typename base::node_type node_type;
323  typedef typename dd_type::size_type size_type;
324  typedef typename dd_type::navigator navi_type;
327 
330 
332  CDegreeArgumentCache(const self& rhs): base(rhs) {}
333 
336 
338  navi_type find(navi_type navi, size_type deg) const{
339  return base::find(navi, degree_node_type(deg, base::manager()));
340  }
341 
343  void insert(navi_type navi, size_type deg, navi_type result) const {
344  base::insert(navi, degree_node_type(deg, base::manager()), result);
345  }
346 
347 };
348 
349 
351 
352 #endif