34 #ifndef RGROUP_RANDOM_SAMPLE_ALLBBS_H
35 #define RGROUP_RANDOM_SAMPLE_ALLBBS_H
38 #include <boost/random.hpp>
39 #include <boost/random/uniform_int_distribution.hpp>
70 boost::uint64_t m_numPermutationsProcessed{0};
72 size_t m_maxoffset{0};
74 boost::minstd_rand m_rng;
75 std::vector<boost::random::uniform_int_distribution<>> m_distributions;
83 for (
size_t i = 0; i < m_permutation.size(); ++i) {
84 m_distributions.emplace_back(0, m_permutation[i] - 1);
91 m_distributions.clear();
92 m_permutation.resize(m_permutationSizes.size());
95 *std::max_element(m_permutationSizes.begin(), m_permutationSizes.end());
96 for (
size_t i = 0; i < m_permutationSizes.size(); ++i) {
97 m_distributions.emplace_back(
98 0, m_permutationSizes[i] - 1);
101 m_numPermutationsProcessed = 0;
104 virtual const char *
type()
const {
return "RandomSampleAllBBsStrategy"; }
108 if (m_offset >= m_maxoffset) {
109 for (
size_t i = 0; i < m_permutation.size(); ++i) {
110 m_permutation[i] = m_distributions[i](m_rng);
114 for (
size_t i = 0; i < m_permutation.size(); ++i) {
115 m_permutation[i] = (m_permutation[i] + 1) % m_permutationSizes[i];
119 ++m_numPermutationsProcessed;
121 return m_permutation;
125 return m_numPermutationsProcessed;
128 virtual operator bool()
const {
return true; }
135 #ifdef RDK_USE_BOOST_SERIALIZATION
136 friend class boost::serialization::access;
138 template <
class Archive>
139 void save(Archive &ar,
const unsigned int )
const {
141 ar << boost::serialization::base_object<const EnumerationStrategyBase>(
143 ar << m_numPermutationsProcessed;
145 std::stringstream random;
147 std::string s = random.str();
154 template <
class Archive>
155 void load(Archive &ar,
const unsigned int ) {
157 ar >> boost::serialization::base_object<EnumerationStrategyBase>(*
this);
158 ar >> m_numPermutationsProcessed;
161 std::stringstream random(s);
167 m_distributions.clear();
168 for (
size_t i = 0; i < m_permutationSizes.size(); ++i) {
169 m_distributions.emplace_back(
170 0, m_permutationSizes[i] - 1);
174 template <
class Archive>
175 void serialize(Archive &ar,
const unsigned int file_version) {
176 boost::serialization::split_member(ar, *
this, file_version);
182 #ifdef RDK_USE_BOOST_SERIALIZATION
This is a class for storing and applying general chemical reactions.
void initialize(const ChemicalReaction &reaction, const EnumerationTypes::BBS &building_blocks)
This is a class for randomly enumerating reagents that ensures all reagents.
EnumerationStrategyBase * copy() const
copy the enumeration strategy complete with current state
virtual const EnumerationTypes::RGROUPS & next()
The current permutation {r1, r2, ...}.
virtual const char * type() const
void initializeStrategy(const ChemicalReaction &, const EnumerationTypes::BBS &)
RandomSampleAllBBsStrategy()
virtual boost::uint64_t getPermutationIdx() const
Returns how many permutations have been processed by this strategy.
#define RDKIT_CHEMREACTIONS_EXPORT
std::vector< boost::uint64_t > RGROUPS
std::vector< MOL_SPTR_VECT > BBS