33 #ifndef ENUMERATION_STRATEGY_H
34 #define ENUMERATION_STRATEGY_H
37 #include "../Reaction.h"
41 #ifdef RDK_USE_BOOST_SERIALIZATION
42 #include <boost/serialization/assume_abstract.hpp>
43 #include <boost/serialization/vector.hpp>
45 #include <boost/serialization/singleton.hpp>
46 #include <boost/serialization/extended_type_info.hpp>
47 #include <boost/serialization/shared_ptr.hpp>
57 :
public std::exception {
61 const char *
message()
const {
return _msg.c_str(); };
75 const std::vector<std::vector<T>> &bbs) {
77 for (
size_t i = 0; i < bbs.size(); ++i) sizes.push_back(bbs[i].size());
86 const std::vector<MOL_SPTR_VECT> &bbs);
129 static const boost::uint64_t EnumerationOverflow =
130 static_cast<boost::uint64_t>(-1);
132 : m_permutation(), m_permutationSizes(), m_numPermutations() {}
136 virtual const char *
type()
const {
return "EnumerationStrategyBase"; }
146 m_permutation.resize(m_permutationSizes.size());
149 std::fill(m_permutation.begin(), m_permutation.end(), 0);
151 initializeStrategy(reaction, building_blocks);
156 virtual void initializeStrategy(
162 virtual operator bool()
const = 0;
179 virtual boost::uint64_t getPermutationIdx()
const = 0;
183 bool skip(boost::uint64_t skipCount) {
184 for (boost::uint64_t i = 0; i < skipCount; ++i) next();
192 m_permutation.resize(rgroups.size());
193 m_permutationSizes = rgroups;
195 std::fill(m_permutation.begin(), m_permutation.end(), 0);
199 friend class boost::serialization::access;
200 template <
class Archive>
201 void serialize(Archive &ar,
const unsigned int ) {
203 ar &m_permutationSizes;
204 ar &m_numPermutations;
207 #ifdef RDK_USE_BOOST_SERIALIZATION
208 BOOST_SERIALIZATION_ASSUME_ABSTRACT(EnumerationStrategyBase)
212 #ifdef RDK_USE_BOOST_SERIALIZATION