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 
86  idx_type m_idx;
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 
113  CIndexCacheHandle(idx_type idx, const manager_type& mgr):
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 
133  navigator m_navi;
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 
167  node_type find(input_node_type navi) const{
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 
290  node_type find(input_node_type navi, idx_type idx) const{
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 
335  CDegreeArgumentCache(const manager_type& mgr): base(mgr) {}
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
dd_type::navigator navi_type
Definition: CDegreeCache.h:215
base::node_type node_type
Extracting inherited node type.
Definition: CCacheManagement.h:474
BoolePolyRing manager_type
Type of decision diagram manager.
Definition: CDegreeCache.h:54
DDType dd_type
Definition: CDegreeCache.h:320
node_type find(navi_type navi) const
Definition: CDegreeCache.h:170
DDType dd_type
Definition: CDegreeCache.h:206
#define END_NAMESPACE_PBORI
Finish project's namespace.
Definition: pbori_defs.h:77
CCacheManagement< BoolePolyRing, tag_type, 2 > base
Definition: CDegreeCache.h:267
CCacheManagement< BoolePolyRing, tag_type, 2 > base
Definition: CDegreeCache.h:322
DDType dd_type
Definition: CDegreeCache.h:265
dd_type::navigator navi_type
Definition: CDegreeCache.h:152
BoolePolyRing manager_type
Type of decision diagram manager.
Definition: CDegreeCache.h:110
CDegreeArgumentCache(const manager_type &mgr)
Constructor.
Definition: CDegreeCache.h:335
idx_type fromNode(navigator navi, const manager_type &mgr) const
Dereference to get stored index.
Definition: CDegreeCache.h:73
manager_type::deg_type deg_type
Definition: CCacheManagement.h:463
#define BEGIN_NAMESPACE_PBORI
Start project's namespace.
Definition: pbori_defs.h:74
~CDegreeCache()
Destructor.
Definition: CDegreeCache.h:164
CIndexHandle< navi_type > node_type
Definition: CDegreeCache.h:276
node_type find(navi_type navi, idx_type idx) const
Definition: CDegreeCache.h:294
node_type find(navi_type navi, deg_type) const
Definition: CDegreeCache.h:185
This template class forms the base for CCommutativeCacheManagement and CacheManager. It is an interface defining find and insert on decision diagram cache.
Definition: CCacheManagement.h:455
idx_type m_idx
Definition: CDegreeCache.h:86
CIndexCacheHandle< navi_type > degree_node_type
Definition: CDegreeCache.h:331
var_type variable(checked_idx_type nvar) const
Access nvar-th ring variable as diagram.
Definition: BoolePolyRing.cc:99
ManagerType manager_type
Definition: CCacheManagement.h:462
CIndexCacheHandle< navi_type > node_cache_type
Definition: CDegreeCache.h:217
void insert(navi_type navi, deg_type upper_bound, deg_type deg) const
Store cached degree wrt. given navigator.
Definition: CDegreeCache.h:249
Definition: CDegreeCache.h:313
CBoundedDegreeCache(const manager_type &mgr)
Constructor.
Definition: CDegreeCache.h:221
dd_type zero() const
Get empty decision diagram.
Definition: BoolePolyRing.cc:42
CCacheManagement< BoolePolyRing, tag_type, 1 > base
Definition: CDegreeCache.h:145
base::node_type input_node_type
Definition: CDegreeCache.h:213
CIndexHandle< navi_type > node_type
Definition: CDegreeCache.h:216
~CDegreeArgumentCache()
Destructor.
Definition: CDegreeCache.h:341
void insert(input_node_type navi, deg_type deg) const
Store cached degree wrt. given navigator.
Definition: CDegreeCache.h:174
This class reinterprets decicion diagram managers as Boolean polynomial rings, adds an ordering and v...
Definition: BoolePolyRing.h:40
navi_type find(navi_type navi, size_type deg) const
Find cached degree wrt. given navigator.
Definition: CDegreeCache.h:344
dd_type::navigator navi_type
Definition: CDegreeCache.h:275
This struct contains auxiliary type definitions.
Definition: pbori_defs.h:210
CBlockDegreeCache(const manager_type &mgr)
Constructor.
Definition: CDegreeCache.h:281
CCacheTypes::degree tag_type
Definition: CDegreeCache.h:207
CIndexCacheHandle< navi_type > node_cache_type
Definition: CDegreeCache.h:154
NaviType navigator
Set actual storage type.
Definition: CDegreeCache.h:95
node_type find(input_node_type navi, deg_type) const
Find cached degree wrt. given navigator (ignoring bound as second argument)
Definition: CDegreeCache.h:183
void insert(navi_type navi, size_type deg, navi_type result) const
Store cached degree wrt. given navigator.
Definition: CDegreeCache.h:349
CDegreeCache(const manager_type &mgr)
Constructor.
Definition: CDegreeCache.h:158
Definition: CDegreeCache.h:91
#define PBORI_LIKELY(expression)
For optimizing if-branches.
Definition: pbori_defs.h:56
~CBoundedDegreeCache()
Destructor.
Definition: CDegreeCache.h:227
navigator m_navi
Actual navigator, which is stored.
Definition: CDegreeCache.h:133
node_type find(navi_type navi, deg_type upper_bound) const
Definition: CDegreeCache.h:236
navigator base
Define type base.
Definition: CDegreeCache.h:42
node_type find(input_node_type navi) const
Find cached degree wrt. given navigator.
Definition: CDegreeCache.h:167
~CBlockDegreeCache()
Destructor.
Definition: CDegreeCache.h:287
void insert(navi_type navi, deg_type deg) const
Store cached degree wrt. given navigator.
Definition: CDegreeCache.h:179
CCacheTypes::degree tag_type
Definition: CDegreeCache.h:144
CIndexHandle(navigator navi, const manager_type &mgr)
Construct from given navigator.
Definition: CDegreeCache.h:60
CTypes::idx_type idx_type
Type for representing indices.
Definition: CDegreeCache.h:48
base::manager_type manager_type
Definition: CDegreeCache.h:214
Definition: CCacheManagement.h:93
void insert(navi_type navi, deg_type, deg_type deg) const
Store cached degree wrt. given navigator.
Definition: CDegreeCache.h:193
navigator::bool_type bool_type
Define type base.
Definition: CDegreeCache.h:101
base::manager_type manager_type
Definition: CDegreeCache.h:274
DDType dd_type
Definition: CDegreeCache.h:143
navigator::bool_type bool_type
Plain Boolean type.
Definition: CDegreeCache.h:45
NaviType navigator
Set actual storage type.
Definition: CDegreeCache.h:39
CIndexCacheHandle(navigator navi)
Construct from given navigator.
Definition: CDegreeCache.h:117
base::node_type input_node_type
Definition: CDegreeCache.h:150
Definition: CDegreeCache.h:200
manager_type::idx_type idx_type
Definition: CCacheManagement.h:465
size_type nVariables() const
Get number of ring variables.
Definition: BoolePolyRing.h:126
CDegreeCache(const self &rhs)
Copy Constructor.
Definition: CDegreeCache.h:161
void insert(navi_type navi, idx_type idx, size_type deg) const
Store cached degree wrt. given navigator.
Definition: CDegreeCache.h:305
CIndexCacheHandle< navi_type > node_cache_type
Definition: CDegreeCache.h:277
Definition: CDegreeCache.h:258
manager_type::size_type size_type
Definition: CCacheManagement.h:464
CIndexCacheHandle(idx_type idx, const manager_type &mgr)
Construct from index.
Definition: CDegreeCache.h:113
CIndexHandle(idx_type idx)
Construct from index.
Definition: CDegreeCache.h:57
TagType tag_type
Definition: CDegreeCache.h:321
base::node_type node_type
Definition: CDegreeCache.h:328
CBoundedDegreeCache(const self &rhs)
Copy Constructor.
Definition: CDegreeCache.h:224
base::manager_type manager_type
Definition: CDegreeCache.h:151
dd_type::navigator navi_type
Definition: CDegreeCache.h:330
polybori::CTypes::idx_type idx_type
Definition: groebner_defs.h:44
CCacheTypes::block_degree tag_type
Definition: CDegreeCache.h:266
bool isValid() const
Definition: CDegreeCache.h:68
void insert(input_node_type navi, deg_type, deg_type deg) const
Store cached degree wrt. given navigator (ignoring bound as second argument)
Definition: CDegreeCache.h:188
void insert(input_node_type navi, idx_type idx, size_type deg) const
Store cached degree wrt. given navigator.
Definition: CDegreeCache.h:299
std::size_t size_type
Type for lengths, dimensions, etc.
Definition: pbori_defs.h:219
Definition: CDegreeCache.h:137
navigator::size_type size_type
Type for representing size.
Definition: CDegreeCache.h:107
This class defines an uses an navigator-like type for storing integer values from 0 upto nmax (number...
Definition: CDegreeCache.h:33
This class defines an iterator for navigating through then and else branches of ZDDs.
Definition: CCuddNavigator.h:36
base::node_type input_node_type
Definition: CDegreeCache.h:273
CBlockDegreeCache(const self &rhs)
Copy Constructor.
Definition: CDegreeCache.h:284
navigator::value_type idx_type
Type for representing indices.
Definition: CDegreeCache.h:104
node_type find(input_node_type navi, deg_type upper_bound) const
Find cached degree wrt. given navigator.
Definition: CDegreeCache.h:230
CTypes::size_type size_type
Type for representing size.
Definition: CDegreeCache.h:51
CIndexHandle< navi_type > node_type
Definition: CDegreeCache.h:153
base::manager_type manager_type
Definition: CDegreeCache.h:329
navigator toNode(idx_type idx, const manager_type &mgr) const
Convert plain number to navigation type.
Definition: CDegreeCache.h:124
node_type find(input_node_type navi, idx_type idx) const
Find cached degree wrt. given navigator.
Definition: CDegreeCache.h:290
#define PBORI_UNLIKELY(expression)
Definition: pbori_defs.h:59
CDegreeArgumentCache(const self &rhs)
Copy Constructor.
Definition: CDegreeCache.h:338
CCacheManagement< BoolePolyRing, tag_type, 2 > base
Definition: CDegreeCache.h:208
idx_type operator*() const
Dereference to get stored index.
Definition: CDegreeCache.h:64
void insert(input_node_type navi, deg_type upper_bound, deg_type deg) const
Store cached degree wrt. given navigator.
Definition: CDegreeCache.h:243
Definition: CCacheManagement.h:59