00001
00002
00014
00015
00016 #ifndef polybori_groebner_PairManager_h_
00017 #define polybori_groebner_PairManager_h_
00018
00019 #include "PairStatusSet.h"
00020
00021
00022
00023 #include "groebner_defs.h"
00024 #include "pairs.h"
00025 #include "PolyEntry.h"
00026 #include "NextSpoly.h"
00027 #include "CheckChainCriterion.h"
00028 #include <polybori/routines/pbori_algo.h>
00029 #include <utility>
00030
00031 BEGIN_NAMESPACE_PBORIGB
00032
00037 class PairManager {
00038 typedef PairManager self;
00039
00040 public:
00041 typedef std::priority_queue<Pair, std::vector<PairE>, PairECompare>
00042 queue_type;
00043
00044 PairManager(const BoolePolyRing& ring):
00045 queue(ring) { }
00046
00047 void appendHiddenGenerators(std::vector<Polynomial>& vec) {
00048 queue_type temp(queue);
00049 while(!temp.empty()){
00050 appendTo(vec, temp.top());
00051 temp.pop();
00052 }
00053 }
00054
00055 void introducePair(const Pair& pair, bool isHFE) {
00056 if (!skip(pair, isHFE)) queue.push(pair);
00057 };
00058
00059 Polynomial nextSpoly(ReductionStrategy& gen) {
00060 if (PBORI_UNLIKELY(pairSetEmpty()))
00061 return gen.leadingTerms.ring().zero();
00062
00063 return NextSpoly(gen, status)(popped());
00064 }
00065
00066 bool pairSetEmpty() const { return queue.empty(); }
00067
00068 template <class StrategyType>
00069 void cleanTopByChainCriterion(StrategyType& strat) {
00070 CheckChainCriterion<StrategyType> continuing(strat, status);
00071 while(!pairSetEmpty() && continuing(queue.top()))
00072 queue.pop();
00073 }
00074
00075 PairStatusSet status;
00076 queue_type queue;
00077
00078 protected:
00080 Pair popped() {
00081 Pair result = queue.top();
00082 queue.pop();
00083 return result;
00084 }
00085
00086 private:
00087 bool skip(const Pair& pair, bool isHFE) {
00088 return isHFE && (pair.getType() == IJ_PAIR) && (pair.sugar > 4);
00089 };
00091 void appendTo(std::vector<Polynomial>& vec, const Pair& current) const {
00092 if (current.getType() == DELAYED_PAIR)
00093 appendTo(vec, current.delayedPair().p);
00094 }
00095
00097 void appendTo(std::vector<Polynomial>& vec, const Polynomial& poly) const {
00098 if (!poly.isZero())
00099 vec.push_back(poly);
00100 }
00101 };
00102
00103 END_NAMESPACE_PBORIGB
00104
00105 #endif