32 #include <boost/shared_ptr.hpp> 36 #include <permlib/abstract_permutation_group.h> 38 #ifndef ABSTRACT_SYMMETRIC_PRODUCT_H_ 39 #define ABSTRACT_SYMMETRIC_PRODUCT_H_ 54 template<
typename InputIterator>
56 for (InputIterator it = begin; it != end; ++it) {
57 m_indices.push_back(std::set<dom_int>((*it).begin(), (*it).end()));
66 virtual bool isLexMinSet(
const std::vector<dom_int>& setIndices,
const std::vector<dom_int>& rankIndices)
const;
68 virtual AbstractGroupType
type()
const {
return AGT_SymmetricProduct; }
75 typedef std::list<std::set<dom_int> > IndexList;
76 std::list<std::set<dom_int> > m_indices;
77 mutable std::map<dom_int, dom_int> m_indicesReverse;
79 int getOrbitRank(dom_int x)
const;
84 sizes.reserve(m_indices.size());
85 BOOST_FOREACH(
const std::set<dom_int>& ind, m_indices) {
86 for (
unsigned long x = ind.size(); x > 1; --x)
92 std::set<dom_int> s(svec.begin(), svec.end());
95 BOOST_FOREACH(
const std::set<dom_int>& ind, m_indices) {
96 std::set<dom_int> sA, sB;
97 std::set_difference(ind.begin(), ind.end(), s.begin(), s.end(), std::inserter(sA, sA.begin()));
99 stabilizer->m_indices.push_back(sA);
101 std::set_intersection(ind.begin(), ind.end(), s.begin(), s.end(), std::inserter(sB, sB.begin()));
103 stabilizer->m_indices.push_back(sB);
116 BOOST_FOREACH(
const std::set<dom_int>& ind, m_indices) {
117 std::set<dom_int>::const_iterator indIt = std::find_first_of(ind.begin(), ind.end(), s.begin(), s.end());
118 if (indIt != ind.end()) {
119 retList->push_back(ind);
126 std::vector<unsigned int> expectedPosition(m_indices.size());
128 BOOST_FOREACH(dom_int x, setIndices) {
131 const int rank = getOrbitRank(x);
135 dom_int position = 0;
136 BOOST_FOREACH(dom_int el, rankIndices) {
139 if (getOrbitRank(el) == rank)
143 if (expectedPosition[rank] != position)
146 ++expectedPosition[rank];
152 inline int AbstractSymmetricProduct::getOrbitRank(dom_int x)
const {
153 if (m_indicesReverse.empty()) {
154 if (m_indices.empty())
158 BOOST_FOREACH(
const std::set<dom_int>& orb, m_indices) {
159 BOOST_FOREACH(dom_int el, orb) {
160 m_indicesReverse[el] = rank;
166 std::map<dom_int, dom_int>::const_iterator pos = m_indicesReverse.find(x);
167 if (pos == m_indicesReverse.end())
170 return (*pos).second;
virtual AbstractGroupType type() const
implementation type of this abstract class
Definition: abstract_symmetric_product.h:68
virtual bool isLexMinSet(const std::vector< dom_int > &setIndices, const std::vector< dom_int > &rankIndices) const
checks whether a set is lexicographically minimal with respect to a given ordering of indices ...
Definition: abstract_symmetric_product.h:125
AbstractSymmetricProduct(InputIterator begin, InputIterator end)
constructor
Definition: abstract_symmetric_product.h:55
std::list< std::set< dom_int > > OrbitList
typedef for a list of orbits, each of which is a set
Definition: abstract_permutation_group.h:74
virtual OrbitList * orbits() const
computes all orbits
Definition: abstract_symmetric_product.h:109
virtual void transversalSizes(std::vector< unsigned long > &sizes) const
fills a list with sizes of transversals along a stabilizer chain
Definition: abstract_symmetric_product.h:82
A high level interface implementing a direct product of symmetric groups.
Definition: abstract_symmetric_product.h:44
stores an orbit in a sorted list
Definition: orbit_list.h:42
A high level interface for a permutation group.
Definition: abstract_permutation_group.h:54
Definition: abstract_bsgs.h:49
virtual AbstractPermutationGroup * setStabilizer(const std::vector< dom_int > &s) const
computes the stabilizer of a set
Definition: abstract_symmetric_product.h:91