00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef PARTITION_SET_STABILIZER_SEARCH_H_
00034 #define PARTITION_SET_STABILIZER_SEARCH_H_
00035
00036 #include "search/partition/r_base.h"
00037 #include "predicate/setwise_stabilizer_predicate.h"
00038
00039 namespace permlib {
00040 namespace partition {
00041
00043 template<class BSGSIN,class TRANSRET>
00044 class SetStabilizerSearch : public RBase<BSGSIN,TRANSRET> {
00045 public:
00046 typedef typename RBase<BSGSIN,TRANSRET>::PERM PERM;
00047
00049
00053 SetStabilizerSearch(const BSGSIN& bsgs, uint pruningLevelDCM);
00054
00056
00060 template<class InputIterator>
00061 void construct(InputIterator begin, InputIterator end);
00062 protected:
00063 virtual uint processNewFixPoints(const Partition& pi, uint backtrackCount);
00064 private:
00065 std::vector<ulong> toStab;
00066 };
00067
00068 template<class BSGSIN,class TRANSRET>
00069 SetStabilizerSearch<BSGSIN,TRANSRET>::SetStabilizerSearch(const BSGSIN& bsgs, uint pruningLevelDCM)
00070 : RBase<BSGSIN,TRANSRET>(bsgs, pruningLevelDCM)
00071 { }
00072
00073 template<class BSGSIN,class TRANSRET>
00074 template<class InputIterator>
00075 void SetStabilizerSearch<BSGSIN,TRANSRET>::construct(InputIterator begin, InputIterator end) {
00076 SetwiseStabilizerPredicate<PERM>* stabPred = new SetwiseStabilizerPredicate<PERM>(begin, end);
00077 toStab.insert(toStab.begin(), begin, end);
00078
00079 SetStabilizeRefinement<PERM> ssr(RBase<BSGSIN,TRANSRET>::m_bsgs.n, toStab.begin(), toStab.end());
00080 ssr.initializeAndApply(RBase<BSGSIN,TRANSRET>::m_partition);
00081 PERM empty(RBase<BSGSIN,TRANSRET>::m_bsgs.n);
00082 ssr.apply2(RBase<BSGSIN,TRANSRET>::m_partition2, empty);
00083
00084 RBase<BSGSIN,TRANSRET>::construct(stabPred, 0);
00085 }
00086
00087 template<class BSGSIN,class TRANSRET>
00088 uint SetStabilizerSearch<BSGSIN,TRANSRET>::processNewFixPoints(const Partition& pi, uint level) {
00089 const uint basePos = RBase<BSGSIN,TRANSRET>::processNewFixPoints(pi, level);
00090 if (!this->m_limitInitialized) {
00091 bool allFound = true;
00092 BOOST_FOREACH(ulong alpha, toStab) {
00093 if (std::find(pi.fixPointsBegin(), pi.fixPointsEnd(), alpha) == pi.fixPointsEnd()) {
00094 allFound = false;
00095 break;
00096 }
00097 }
00098 if (allFound) {
00099 this->m_limitLevel = level;
00100 this->m_limitBase = basePos;
00101 this->m_limitInitialized = true;
00102 }
00103 }
00104 return basePos;
00105 }
00106
00107 }
00108 }
00109
00110 #endif // -- PARTITION_SET_STABILIZER_SEARCH_H_