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;
74 boost::minstd_rand m_rng;
75 std::vector<boost::random::uniform_int_distribution<>> m_distributions;
80 m_numPermutationsProcessed(0),
85 for (
size_t i = 0; i < m_permutation.size(); ++i) {
86 m_distributions.push_back(
87 boost::random::uniform_int_distribution<>(0, m_permutation[i] - 1));
94 m_distributions.clear();
95 m_permutation.resize(m_permutationSizes.size());
96 m_permutationSizes = m_permutationSizes;
99 *std::max_element(m_permutationSizes.begin(), m_permutationSizes.end());
100 for (
size_t i = 0; i < m_permutationSizes.size(); ++i) {
101 m_distributions.push_back(boost::random::uniform_int_distribution<>(
102 0, m_permutationSizes[i] - 1));
105 m_numPermutationsProcessed = 0;
108 virtual const char *
type()
const {
return "RandomSampleAllBBsStrategy"; }
112 if (m_offset >= m_maxoffset) {
113 for (
size_t i = 0; i < m_permutation.size(); ++i) {
114 m_permutation[i] = m_distributions[i](m_rng);
118 for (
size_t i = 0; i < m_permutation.size(); ++i) {
119 m_permutation[i] = (m_permutation[i] + 1) % m_permutationSizes[i];
123 ++m_numPermutationsProcessed;
125 return m_permutation;
129 return m_numPermutationsProcessed;
132 virtual operator bool()
const {
return true; }
139 #ifdef RDK_USE_BOOST_SERIALIZATION
140 friend class boost::serialization::access;
142 template <
class Archive>
143 void save(Archive &ar,
const unsigned int )
const {
145 ar << boost::serialization::base_object<const EnumerationStrategyBase>(
147 ar << m_numPermutationsProcessed;
149 std::stringstream random;
151 std::string s = random.str();
158 template <
class Archive>
159 void load(Archive &ar,
const unsigned int ) {
161 ar >> boost::serialization::base_object<EnumerationStrategyBase>(*
this);
162 ar >> m_numPermutationsProcessed;
165 std::stringstream random(s);
171 m_distributions.clear();
172 for (
size_t i = 0; i < m_permutationSizes.size(); ++i) {
173 m_distributions.push_back(boost::random::uniform_int_distribution<>(
174 0, m_permutationSizes[i] - 1));
178 template <
class Archive>
179 void serialize(Archive &ar,
const unsigned int file_version) {
180 boost::serialization::split_member(ar, *
this, file_version);
186 #ifdef RDK_USE_BOOST_SERIALIZATION