15 #include "../RDKitBase.h" 40 const std::vector<unsigned>& queryAtomLabels,
41 const std::vector<unsigned>& queryBondLabels) {
42 computeMorganCodeHash(seed, queryAtomLabels, queryBondLabels);
46 void computeMorganCodeHash(
const Seed& seed,
47 const std::vector<unsigned>& queryAtomLabels,
48 const std::vector<unsigned>& queryBondLabels) {
51 std::vector<unsigned long> currCodes(nv);
52 std::vector<unsigned long> prevCodes(nv);
54 if (nIterations > 5) nIterations = 5;
56 for (
unsigned seedAtomIdx = 0; seedAtomIdx < seed.
getNumAtoms();
58 currCodes[seedAtomIdx] =
61 for (
size_t iter = 0; iter < nIterations; iter++) {
62 for (
size_t i = 0; i < nv; i++) prevCodes[i] = currCodes[i];
64 for (
size_t seedBondIdx = 0; seedBondIdx < ne; seedBondIdx++) {
74 unsigned v1 = prevCodes[atom1];
75 unsigned v2 = prevCodes[atom2];
77 currCodes[atom1] += v2 * v2 + (v2 + 23) * (order + 1721);
78 currCodes[atom2] += v1 * v1 + (v1 + 23) * (order + 1721);
83 for (
unsigned seedAtomIdx = 0; seedAtomIdx < nv; seedAtomIdx++) {
84 unsigned long code = currCodes[seedAtomIdx];
85 result += code * (code + 6849) + 29;
88 NumericMetrics.
Value = result;
111 std::vector<TIndexEntry> ValueStorage;
112 std::map<KeyNumericMetrics::TValue, size_t> NumericIndex;
120 const std::vector<unsigned>& queryAtomLabels,
121 const std::vector<unsigned>& queryBondLabels,
123 key.
computeKey(seed, queryAtomLabels, queryBondLabels);
124 std::map<KeyNumericMetrics::TValue, size_t>::const_iterator entryit =
126 if (NumericIndex.end() != entryit)
return &ValueStorage[entryit->second];
133 TIndexEntry* entry) {
142 entry = &ValueStorage.back();
146 if (!NumericIndex.insert(std::pair<KeyNumericMetrics::TValue, size_t>(
148 ValueStorage.size() - 1)).second)
153 return ValueStorage.size();
158 for (std::vector<TIndexEntry>::const_iterator e = ValueStorage.begin();
159 e != ValueStorage.end(); e++)
void computeKey(const Seed &seed, const std::vector< unsigned > &queryAtomLabels, const std::vector< unsigned > &queryBondLabels)
std::vector< unsigned > BondsIdx
std::map< unsigned, unsigned > SeedAtomIdxMap
KeyNumericMetrics NumericMetrics
void add(const Seed &seed, TKey &key, TIndexEntry *entry)
unsigned long long TValue
unsigned getNumAtoms() const
unsigned int getEndAtomIdx() const
returns the index of our end Atom
Includes a bunch of functionality for handling Atom and Bond queries.
class for representing a bond
std::list< FMCS::Graph > TIndexEntry
unsigned int getBeginAtomIdx() const
returns the index of our begin Atom
MolFragment MoleculeFragment
std::vector< const Bond * > Bonds
TIndexEntry * find(const Seed &seed, const std::vector< unsigned > &queryAtomLabels, const std::vector< unsigned > &queryBondLabels, TKey &key)
std::vector< unsigned > AtomsIdx
unsigned getNumBonds() const