33 #ifndef BASECONSTRUCTION_H
34 #define BASECONSTRUCTION_H
39 #include <permlib/predicate/pointwise_stabilizer_predicate.h>
40 #include <permlib/predicate/identity_predicate.h>
45 template <
class PERM,
class TRANS>
66 template <
class ForwardIterator,
class InputIterator>
67 void setup(ForwardIterator generatorsBegin, ForwardIterator generatorsEnd, InputIterator prescribedBaseBegin, InputIterator prescribedBaseEnd,
BSGS<PERM, TRANS> &bsgs, std::vector<std::list<typename PERM::ptr> > &S)
const;
73 static const unsigned long *
empty;
80 template <
class PERM,
class TRANS>
84 template <
class PERM,
class TRANS>
89 template <
class PERM,
class TRANS>
90 template <
class ForwardIterator,
class InputIterator>
93 std::vector<dom_int> &B = bsgs.
B;
94 std::vector<TRANS> &U = bsgs.
U;
96 std::list<typename PERM::ptr> nonIdentityGenerators;
97 std::remove_copy_if(generatorsBegin, generatorsEnd, std::back_inserter(nonIdentityGenerators),
IdentityPredicate<PERM>());
99 B.insert(B.begin(), prescribedBaseBegin, prescribedBaseEnd);
101 dom_int beta = m_n + 1;
103 BOOST_FOREACH(
const typename PERM::ptr &gen, nonIdentityGenerators) {
114 U.push_back(TRANS(m_n));
116 std::list<typename PERM::ptr> S_0;
118 U[0].orbit(B[0], S_0);
125 std::vector<dom_int>::iterator Bit;
126 for (Bit = B.begin(); Bit != B.end(); ++Bit) {
127 std::list<typename PERM::ptr> S_i;
128 std::copy_if(nonIdentityGenerators.begin(), nonIdentityGenerators.end(),
131 U.push_back(TRANS(m_n));
140 template <
class PERM,
class TRANS>
142 std::map<PERM*,typename PERM::ptr> generatorMap;
144 BOOST_FOREACH(std::list<typename PERM::ptr> &S_j, S) {
145 BOOST_FOREACH(
typename PERM::ptr &gen, S_j) {
147 BOOST_FOREACH(
const typename PERM::ptr& genS, ret.
S) {
150 generatorMap.insert(std::make_pair(gen.get(), genS));
155 ret.
S.push_back(gen);
156 generatorMap.insert(std::make_pair(gen.get(), gen));
161 BOOST_FOREACH(TRANS& U_i, ret.
U) {
162 U_i.updateGenerators(generatorMap);
168 #endif // -- BASECONSTRUCTION_H