PolyBoRi
CDegreeCache.h
Go to the documentation of this file.
1 // -*- c++ -*-
2 //*****************************************************************************
14 //*****************************************************************************
15 
16 #ifndef polybori_cache_CDegreeCache_h_
17 #define polybori_cache_CDegreeCache_h_
18 
19 // include basic definitions
20 #include <polybori/pbori_defs.h>
21 #include <polybori/BooleEnv.h>
22 
23 #include "CCacheManagement.h"
24 
26 //class BoolePolyRing;
32 template <class NaviType>
33 class CIndexHandle {
34 public:
35 
36  enum { invalid = CTypes::max_idx };
37 
39  typedef NaviType navigator;
40 
42  typedef navigator base;
43 
45  typedef typename navigator::bool_type bool_type;
46 
48  typedef typename CTypes::idx_type idx_type;
49 
51  typedef typename CTypes::size_type size_type;
52 
55 
57  CIndexHandle(idx_type idx): m_idx(idx) {}
58 
60  explicit CIndexHandle(navigator navi, const manager_type& mgr):
61  m_idx(fromNode(navi, mgr)) {}
62 
64  idx_type operator*() const {
65  return m_idx;
66  }
67 
68  bool isValid() const {
69  return (m_idx != invalid);
70  }
71 protected:
73  idx_type fromNode(navigator navi, const manager_type& mgr) const {
74 
75  if (!navi.isValid())
76  return invalid;
77 
78  if PBORI_UNLIKELY(navi.isConstant())
79  return mgr.nVariables();
80  else
81  return *navi;
82  }
83 
84 
85 
87 };
88 
89 
90 template <class NaviType>
92 public:
93 
95  typedef NaviType navigator;
96 
98  // typedef navigator base;
99 
101  typedef typename navigator::bool_type bool_type;
102 
104  typedef typename navigator::value_type idx_type;
105 
107  typedef typename navigator::size_type size_type;
108 
111 
114  m_navi( toNode(idx, mgr) ) {}
115 
117  explicit CIndexCacheHandle(navigator navi):
118  m_navi(navi) {}
119 
120  operator navigator() const { return m_navi; }
121 
122 protected:
124  navigator toNode(idx_type idx, const manager_type& mgr) const {
125 
126  if PBORI_LIKELY((size_type)idx < mgr.nVariables())
127  return mgr.variable(idx).set().navigation();
128 
129  return mgr.zero().navigation();
130  }
131 
134 };
135 
136 template <class DDType>
138  public CCacheManagement<BoolePolyRing, typename CCacheTypes::degree, 1> {
139  typedef CDegreeCache self;
140 public:
142 
143  typedef DDType dd_type;
144  typedef typename CCacheTypes::degree tag_type;
147 
149 
150  typedef typename base::node_type input_node_type;
151  typedef typename base::manager_type manager_type;
152  typedef typename dd_type::navigator navi_type;
156 
158  CDegreeCache(const manager_type& mgr): base(mgr) {}
159 
161  CDegreeCache(const self& rhs): base(rhs) {}
162 
165 
168  return node_type(base::find(navi), base::manager()); }
169 
170  node_type find(navi_type navi) const{
171  return node_type(base::find(navi), base::manager()); }
172 
174  void insert(input_node_type navi, deg_type deg) const {
175  base::insert(navi, node_cache_type(deg, base::manager()));
176  }
177 
179  void insert(navi_type navi, deg_type deg) const {
180  base::insert(navi, node_cache_type(deg, base::manager()));
181  }
183  node_type find(input_node_type navi, deg_type) const { return self::find(navi); }
184 
185  node_type find(navi_type navi, deg_type) const{ return self::find(navi); }
186 
188  void insert(input_node_type navi, deg_type, deg_type deg) const {
189  self::insert(navi, deg);
190  }
191 
193  void insert(navi_type navi, deg_type, deg_type deg) const {
194  self::insert(navi, deg);
195  }
196 
197 };
198 
199 template <class DDType>
201  public CCacheManagement<BoolePolyRing, typename CCacheTypes::degree, 2> {
202  typedef CBoundedDegreeCache self;
203 public:
205 
206  typedef DDType dd_type;
207  typedef typename CCacheTypes::degree tag_type;
210 
212 
215  typedef typename dd_type::navigator navi_type;
219 
221  CBoundedDegreeCache(const manager_type& mgr): base(mgr) {}
222 
224  CBoundedDegreeCache(const self& rhs): base(rhs) {}
225 
228 
230  node_type find(input_node_type navi, deg_type upper_bound) const{
231  return node_type(base::find(navi,
232  node_cache_type(upper_bound, base::manager())),
233  base::manager());
234  }
235 
236  node_type find(navi_type navi, deg_type upper_bound) const{
237  return node_type(base::find(navi,
238  node_cache_type(upper_bound, base::manager())),
239  base::manager());
240  }
241 
243  void insert(input_node_type navi, deg_type upper_bound, deg_type deg) const {
244  base::insert(navi, node_cache_type(upper_bound, base::manager()),
245  node_cache_type(deg, base::manager()));
246  }
247 
249  void insert(navi_type navi, deg_type upper_bound, deg_type deg) const {
250  base::insert(navi, node_cache_type(upper_bound, base::manager()),
251  node_cache_type(deg, base::manager()));
252  }
253 
254 };
255 
256 
257 template <class DDType>
259  public CCacheManagement<BoolePolyRing,
260  typename CCacheTypes::block_degree, 2> {
261 
262 public:
264 
265  typedef DDType dd_type;
270 
272 
273  typedef typename base::node_type input_node_type;
274  typedef typename base::manager_type manager_type;
275  typedef typename dd_type::navigator navi_type;
279 
281  CBlockDegreeCache(const manager_type& mgr): base(mgr) {}
282 
284  CBlockDegreeCache(const self& rhs): base(rhs) {}
285 
288 
291  return node_type(base::find(navi, node_cache_type(idx, base::manager())),
292  base::manager()); }
293 
294  node_type find(navi_type navi, idx_type idx) const{
295  return node_type(base::find(navi, node_cache_type(idx, base::manager())),
296  base::manager()); }
297 
299  void insert(input_node_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 
305  void insert(navi_type navi, idx_type idx, size_type deg) const {
306  base::insert(navi, node_cache_type(idx, base::manager()),
307  node_cache_type(deg, base::manager()));
308  }
309 };
310 
311 template <class TagType,
312  class DDType>
314  public CCacheManagement<BoolePolyRing, TagType, 2>,
315  public CAuxTypes {
316 
317 public:
319 
320  typedef DDType dd_type;
321  typedef TagType tag_type;
325 
327 
328  typedef typename base::node_type node_type;
330  typedef typename dd_type::navigator navi_type;
333 
336 
338  CDegreeArgumentCache(const self& rhs): base(rhs) {}
339 
342 
344  navi_type find(navi_type navi, size_type deg) const{
345  return base::find(navi, degree_node_type(deg, base::manager()));
346  }
347 
349  void insert(navi_type navi, size_type deg, navi_type result) const {
350  base::insert(navi, degree_node_type(deg, base::manager()), result);
351  }
352 
353 };
354 
355 
357 
358 #endif