12 #ifndef RD_MAXMINPICKER_H
13 #define RD_MAXMINPICKER_H
22 #include <boost/random.hpp>
63 unsigned int pickSize)
const;
67 unsigned int pickSize,
73 unsigned int pickSize,
75 double &threshold)
const;
115 int seed = -1)
const {
118 if (poolSize < pickSize)
120 distmatFunctor functor(distMat);
121 return this->lazyPick(functor, poolSize, pickSize, firstPicks,
seed);
126 unsigned int pickSize)
const {
128 return pick(distMat, poolSize, pickSize, iv);
140 template <
typename T>
142 unsigned int pickSize,
144 int seed,
double &threshold)
const {
147 if (poolSize < pickSize)
152 unsigned int memsize = (
unsigned int)(poolSize *
sizeof(
MaxMinPickInfo));
154 memset(pinfo, 0, memsize);
156 picks.reserve(pickSize);
157 unsigned int picked = 0;
158 unsigned int pick = 0;
161 if (firstPicks.empty()) {
164 typedef boost::uniform_int<> distrib_type;
165 typedef boost::variate_generator<rng_type &, distrib_type> source_type;
167 distrib_type dist(0, poolSize - 1);
169 generator.seed(
static_cast<rng_type::result_type
>(
seed));
171 generator.seed(std::random_device()());
173 source_type randomSource(generator, dist);
174 pick = randomSource();
176 picks.push_back(
pick);
182 for (RDKit::INT_VECT::const_iterator pIdx = firstPicks.begin();
183 pIdx != firstPicks.end(); ++pIdx) {
184 pick =
static_cast<unsigned int>(*pIdx);
185 if (
pick >= poolSize) {
189 picks.push_back(
pick);
195 if (picked >= pickSize) {
201 unsigned int pool_list = 0;
202 unsigned int *prev = &pool_list;
204 for (
unsigned int i = 0; i < poolSize; i++)
205 if (pinfo[i].picks == 0) {
207 prev = &pinfo[i].
next;
211 unsigned int poolIdx;
212 unsigned int pickIdx;
219 pinfo[poolIdx].
dist_bound = func(poolIdx, pickIdx);
220 pinfo[poolIdx].
picks = 1;
221 prev = &pinfo[poolIdx].
next;
222 }
while (*prev != 0);
225 double maxOFmin = -1.0;
226 double tmpThreshold = -1.0;
227 while (picked < pickSize) {
228 unsigned int *pick_prev = 0;
234 if (minTOi > maxOFmin) {
235 unsigned int pi = pinfo[poolIdx].
picks;
236 while (pi < picked) {
237 unsigned int picki = picks[pi];
239 double dist = func(poolIdx, picki);
241 if (dist <= minTOi) {
243 if (minTOi <= maxOFmin)
break;
247 pinfo[poolIdx].
picks = pi;
248 if (minTOi > maxOFmin) {
254 prev = &pinfo[poolIdx].
next;
255 }
while (*prev != 0);
258 if (maxOFmin <= threshold && threshold >= 0.0)
break;
259 tmpThreshold = maxOFmin;
262 picks.push_back(
pick);
266 threshold = tmpThreshold;
271 template <
typename T>
273 unsigned int pickSize,
276 double threshold = -1.0;
281 template <
typename T>
283 unsigned int pickSize)
const {
285 double threshold = -1.0;