1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
//
// Copyright (C) 2020 Greg Landrum and T5 Informatics GmbH
//
// @@ All Rights Reserved @@
// This file is part of the RDKit.
// The contents are covered by the terms of the BSD license
// which is included in the file license.txt, found at the root
// of the RDKit source tree.
//
#include "MolEnumerator.h"
#include <RDGeneral/Exceptions.h>
namespace RDKit {
namespace MolEnumerator {
namespace {
//! recursively builds the variations
void getVariations(size_t level, std::vector<size_t> base,
std::vector<std::vector<size_t>> &variations,
const std::vector<size_t> &variationCounts,
size_t maxToEnumerate, bool doRandom) {
PRECONDITION(level < variationCounts.size(), "bad recursion");
for (size_t i = 0; i < variationCounts[level]; ++i) {
base[level] = i;
if (level + 1 >= variationCounts.size()) {
// at the bottom of the recursion
variations.push_back(base);
} else {
getVariations(level + 1, base, variations, variationCounts,
maxToEnumerate, doRandom);
}
if (variations.size() >= maxToEnumerate) return;
}
}
void enumerateVariations(std::vector<std::vector<size_t>> &variations,
const std::vector<size_t> &variationCounts,
const MolEnumeratorParams ¶ms) {
if (params.doRandom) {
UNDER_CONSTRUCTION("random enumeration not yet supported");
}
variations.clear();
std::vector<size_t> base(variationCounts.size(), 0);
getVariations(0, base, variations, variationCounts, params.maxToEnumerate,
params.doRandom);
}
} // namespace
MolBundle enumerate(const ROMol &mol, const MolEnumeratorParams ¶ms) {
MolBundle res;
PRECONDITION(params.dp_operation, "no operation set");
// copy the op since we will modify it:
auto op = params.dp_operation->copy();
op->initFromMol(mol);
auto variationCounts = op->getVariationCounts();
if (variationCounts.empty()) {
return res;
}
std::vector<std::vector<size_t>> variations;
enumerateVariations(variations, variationCounts, params);
for (const auto &variation : variations) {
auto newMol = (*op)(variation);
newMol->updatePropertyCache(false);
res.addMol(ROMOL_SPTR(newMol.release()));
}
return res;
}
} // namespace MolEnumerator
} // namespace RDKit
|