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 int getBeginAtomIdx() const
returns the index of our begin Atom
unsigned long long TValue
unsigned getNumBonds() const
unsigned int getEndAtomIdx() const
returns the index of our end Atom
class for representing a bond
std::list< FMCS::Graph > TIndexEntry
MolFragment MoleculeFragment
std::vector< const Bond * > Bonds
TIndexEntry * find(const Seed &seed, const std::vector< unsigned > &queryAtomLabels, const std::vector< unsigned > &queryBondLabels, TKey &key)
unsigned getNumAtoms() const
std::vector< unsigned > AtomsIdx