RDKit
Open-source cheminformatics and machine learning.
Loading...
Searching...
No Matches
RandomSample.h
Go to the documentation of this file.
1//
2// Copyright (c) 2015, Novartis Institutes for BioMedical Research Inc.
3// All rights reserved.
4//
5// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions are
7// met:
8//
9// * Redistributions of source code must retain the above copyright
10// notice, this list of conditions and the following disclaimer.
11// * Redistributions in binary form must reproduce the above
12// copyright notice, this list of conditions and the following
13// disclaimer in the documentation and/or other materials provided
14// with the distribution.
15// * Neither the name of Novartis Institutes for BioMedical Research Inc.
16// nor the names of its contributors may be used to endorse or promote
17// products derived from this software without specific prior written
18// permission.
19//
20// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31//
32
33#include <RDGeneral/export.h>
34#ifndef RGROUP_RANDOM_SAMPLE_H
35#define RGROUP_RANDOM_SAMPLE_H
36
38#include <boost/random.hpp>
39#include <boost/random/uniform_int_distribution.hpp>
40#include <sstream>
41
42namespace RDKit {
43
44//! This is a class for fully randomly sampling reagents.
45/// Note that this enumerator never halts.
46/*!
47 basic usage:
48
49 \verbatim
50 std::vector<MOL_SPTR_VECT> bbs;
51 bbs.push_back( bbs_for_reactants_1 );
52 bbs.push_back( bbs_for_reactants_2 );
53
54 RandomSampleStrategy rgroups;
55 rgroups.initialize(rxn, bbs);
56 for(size_t i=0; i<num_samples && rgroups; ++i) {
57 MOL_SPTR_VECT rvect = getReactantsFromRGroups(bbs, rgroups.next());
58 std::vector<MOL_SPTR_VECT> lprops = rxn.RunReactants(rvect);
59 ...
60 }
61 \endverbatim
62
63 See EnumerationStrategyBase for more details and usage.
64*/
67 boost::uint64_t m_numPermutationsProcessed{};
68 boost::minstd_rand m_rng;
69 std::vector<boost::random::uniform_int_distribution<>> m_distributions;
70
71 public:
74
75 m_rng(),
76 m_distributions() {
77 for (size_t i = 0; i < m_permutation.size(); ++i) {
78 m_distributions.emplace_back(0, m_permutation[i] - 1);
79 }
80 }
81
82 using EnumerationStrategyBase::initialize;
83
85 const EnumerationTypes::BBS &) override {
86 m_distributions.clear();
87 for (size_t i = 0; i < m_permutationSizes.size(); ++i) {
88 m_distributions.emplace_back(0, m_permutationSizes[i] - 1);
89 }
90
91 m_numPermutationsProcessed = 0;
92 }
93
94 const char *type() const override { return "RandomSampleStrategy"; }
95
96 //! The current permutation {r1, r2, ...}
97 const EnumerationTypes::RGROUPS &next() override {
98 for (size_t i = 0; i < m_permutation.size(); ++i) {
99 m_permutation[i] = m_distributions[i](m_rng);
100 }
101
102 ++m_numPermutationsProcessed;
103
104 return m_permutation;
105 }
106
107 boost::uint64_t getPermutationIdx() const override {
108 return m_numPermutationsProcessed;
109 }
110
111 operator bool() const override { return true; }
112
113 EnumerationStrategyBase *copy() const override {
114 return new RandomSampleStrategy(*this);
115 }
116
117 private:
118#ifdef RDK_USE_BOOST_SERIALIZATION
119 friend class boost::serialization::access;
120
121 template <class Archive>
122 void save(Archive &ar, const unsigned int /*version*/) const {
123 // invoke serialization of the base class
124 ar << boost::serialization::base_object<const EnumerationStrategyBase>(
125 *this);
126 ar << m_numPermutationsProcessed;
127
128 std::stringstream random;
129 random << m_rng;
130 std::string s = random.str();
131 ar << s;
132 }
133
134 template <class Archive>
135 void load(Archive &ar, const unsigned int /*version*/) {
136 // invoke serialization of the base class
137 ar >> boost::serialization::base_object<EnumerationStrategyBase>(*this);
138 ar >> m_numPermutationsProcessed;
139 std::string s;
140 ar >> s;
141 std::stringstream random(s);
142 random >> m_rng;
143
144 // reset the uniform distributions
145 m_distributions.clear();
146 for (size_t i = 0; i < m_permutationSizes.size(); ++i) {
147 m_distributions.emplace_back(0, m_permutationSizes[i] - 1);
148 }
149 }
150
151 template <class Archive>
152 void serialize(Archive &ar, const unsigned int file_version) {
153 boost::serialization::split_member(ar, *this, file_version);
154 }
155#endif
156};
157} // namespace RDKit
158
159#ifdef RDK_USE_BOOST_SERIALIZATION
160BOOST_CLASS_VERSION(RDKit::RandomSampleStrategy, 1)
161#endif
162
163#endif
This is a class for storing and applying general chemical reactions.
Definition Reaction.h:121
EnumerationStrategyBase * copy() const override
copy the enumeration strategy complete with current state
const EnumerationTypes::RGROUPS & next() override
The current permutation {r1, r2, ...}.
boost::uint64_t getPermutationIdx() const override
Returns how many permutations have been processed by this strategy.
const char * type() const override
void initializeStrategy(const ChemicalReaction &, const EnumerationTypes::BBS &) override
#define RDKIT_CHEMREACTIONS_EXPORT
Definition export.h:49
std::vector< boost::uint64_t > RGROUPS
std::vector< MOL_SPTR_VECT > BBS
Std stuff.