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_IMAGE_SEARCH_H_
00034 #define PARTITION_SET_IMAGE_SEARCH_H_
00035
00036 #include "search/partition/r_base.h"
00037 #include "predicate/set_image_predicate.h"
00038
00039 namespace permlib {
00040 namespace partition {
00041
00043
00046 template<class BSGSIN,class TRANSRET>
00047 class SetImageSearch : public RBase<BSGSIN,TRANSRET> {
00048 public:
00049 typedef typename RBase<BSGSIN,TRANSRET>::PERM PERM;
00050
00052
00056 SetImageSearch(const BSGSIN& bsgs, uint pruningLevelDCM);
00057
00059
00065 template<class InputIterator>
00066 void construct(InputIterator begin, InputIterator end, InputIterator beginImg, InputIterator endImg);
00067 protected:
00068 virtual uint processNewFixPoints(const Partition& pi, uint backtrackCount);
00069 private:
00070 std::vector<ulong> toStab;
00071 };
00072
00073 template<class BSGSIN,class TRANSRET>
00074 SetImageSearch<BSGSIN,TRANSRET>::SetImageSearch(const BSGSIN& bsgs, uint pruningLevelDCM)
00075 : RBase<BSGSIN,TRANSRET>(bsgs, pruningLevelDCM, true)
00076 { }
00077
00078 template<class BSGSIN,class TRANSRET>
00079 template<class InputIterator>
00080 void SetImageSearch<BSGSIN,TRANSRET>::construct(InputIterator begin, InputIterator end, InputIterator beginImg, InputIterator endImg) {
00081 SetImagePredicate<PERM>* stabPred = new SetImagePredicate<PERM>(begin, end, beginImg, endImg);
00082 toStab.insert(toStab.begin(), begin, end);
00083
00084 SetImageRefinement<PERM> sir(RBase<BSGSIN,TRANSRET>::m_bsgs.n, begin, end, beginImg, endImg);
00085 sir.initializeAndApply(RBase<BSGSIN,TRANSRET>::m_partition);
00086 PERM empty(RBase<BSGSIN,TRANSRET>::m_bsgs.n);
00087 sir.apply2(RBase<BSGSIN,TRANSRET>::m_partition2, empty);
00088
00089 RBase<BSGSIN,TRANSRET>::construct(stabPred, 0);
00090 }
00091
00092 template<class BSGSIN,class TRANSRET>
00093 uint SetImageSearch<BSGSIN,TRANSRET>::processNewFixPoints(const Partition& pi, uint level) {
00094 const uint basePos = RBase<BSGSIN,TRANSRET>::processNewFixPoints(pi, level);
00095 if (!this->m_limitInitialized) {
00096 bool allFound = true;
00097 BOOST_FOREACH(ulong alpha, toStab) {
00098 if (std::find(pi.fixPointsBegin(), pi.fixPointsEnd(), alpha) == pi.fixPointsEnd()) {
00099 allFound = false;
00100 break;
00101 }
00102 }
00103 if (allFound) {
00104 this->m_limitLevel = level;
00105 this->m_limitBase = basePos;
00106 this->m_limitInitialized = true;
00107 }
00108 }
00109 return basePos;
00110 }
00111
00112 }
00113 }
00114
00115 #endif // -- PARTITION_SET_IMAGE_SEARCH_H_