PolyBoRi
PairManager.h
Go to the documentation of this file.
1 // -*- c++ -*-
2 //*****************************************************************************
14 //*****************************************************************************
15 
16 #ifndef polybori_groebner_PairManager_h_
17 #define polybori_groebner_PairManager_h_
18 
19 #include "PairStatusSet.h"
20 
21 
22 // include basic definitions
23 #include "groebner_defs.h"
24 #include "pairs.h"
25 #include "PolyEntry.h"
26 #include "NextSpoly.h"
27 #include "CheckChainCriterion.h"
29 #include <utility>
30 
32 
37 class PairManager {
38  typedef PairManager self;
39 
40 public:
41  typedef std::priority_queue<Pair, std::vector<PairE>, PairECompare>
43 
44  PairManager(const BoolePolyRing& ring):
45  queue(ring) { }
46 
47  void appendHiddenGenerators(std::vector<Polynomial>& vec) {
48  queue_type temp(queue);
49  while(!temp.empty()){
50  appendTo(vec, temp.top());
51  temp.pop();
52  }
53  }
54 
55  void introducePair(const Pair& pair, bool isHFE) {
56  if (!skip(pair, isHFE)) queue.push(pair);
57  };
58 
60  if (PBORI_UNLIKELY(pairSetEmpty()))
61  return gen.leadingTerms.ring().zero();
62 
63  return NextSpoly(gen, status)(popped());
64  }
65 
66  bool pairSetEmpty() const { return queue.empty(); }
67 
68  template <class StrategyType>
69  void cleanTopByChainCriterion(StrategyType& strat) {
70  CheckChainCriterion<StrategyType> continuing(strat, status);
71  while(!pairSetEmpty() && continuing(queue.top()))
72  queue.pop();
73  }
74 
77 
78 protected:
81  Pair result = queue.top();
82  queue.pop();
83  return result;
84  }
85 
86 private:
87  bool skip(const Pair& pair, bool isHFE) {
88  return isHFE && (pair.getType() == IJ_PAIR) && (pair.sugar > 4);
89  };
91  void appendTo(std::vector<Polynomial>& vec, const Pair& current) const {
92  if (current.getType() == DELAYED_PAIR)
93  appendTo(vec, current.delayedPair().p);
94  }
95 
97  void appendTo(std::vector<Polynomial>& vec, const Polynomial& poly) const {
98  if (!poly.isZero())
99  vec.push_back(poly);
100  }
101 };
102 
104 
105 #endif /* polybori_groebner_PairManager_h_ */
#define END_NAMESPACE_PBORIGB
Definition: groebner_defs.h:16
Definition: PairLS.h:29
This class computes the next spoly for a generator pair.
Definition: NextSpoly.h:30
dd_type zero() const
Get empty decision diagram.
Definition: BoolePolyRing.cc:42
PairE Pair
Definition: pairs.h:40
This class reinterprets decicion diagram managers as Boolean polynomial rings, adds an ordering and v...
Definition: BoolePolyRing.h:40
BoolePolynomial Polynomial
Definition: embed.h:51
#define BEGIN_NAMESPACE_PBORIGB
Definition: groebner_defs.h:15
This class defines PairE.
Definition: PairE.h:28
void cleanTopByChainCriterion(StrategyType &strat)
Definition: PairManager.h:69
PairStatusSet status
Definition: PairManager.h:75
This class wraps the underlying decicion diagram type and defines the necessary operations.
Definition: BoolePolynomial.h:85
const ring_type & ring() const
Get reference to ring.
Definition: CCuddDDFacade.h:250
Polynomial nextSpoly(ReductionStrategy &gen)
Definition: PairManager.h:59
This class defines CheckChainCriterion.
Definition: CheckChainCriterion.h:30
void appendHiddenGenerators(std::vector< Polynomial > &vec)
Definition: PairManager.h:47
deg_type sugar
Definition: PairE.h:36
int getType() const
Definition: PairE.h:32
PairManager(const BoolePolyRing &ring)
Definition: PairManager.h:44
This class defines PairManager.
Definition: PairManager.h:37
Pair popped()
top() and pop() at once
Definition: PairManager.h:80
This class defines PairECompare.
Definition: PairECompare.h:28
queue_type queue
Definition: PairManager.h:76
bool pairSetEmpty() const
Definition: PairManager.h:66
std::priority_queue< Pair, std::vector< PairE >, PairECompare > queue_type
Definition: PairManager.h:42
LeadingTerms leadingTerms
Definition: ReductionTerms.h:51
void introducePair(const Pair &pair, bool isHFE)
Definition: PairManager.h:55
This class defines ReductionStrategy.
Definition: ReductionStrategy.h:34
This class defines PairStatusSet.
Definition: PairStatusSet.h:30
#define PBORI_UNLIKELY(expression)
Definition: pbori_defs.h:59
Definition: PairLS.h:30