16 #include "../RDKitBase.h"
41 const std::vector<unsigned>& queryAtomLabels,
42 const std::vector<unsigned>& queryBondLabels) {
43 computeMorganCodeHash(
seed, queryAtomLabels, queryBondLabels);
47 void computeMorganCodeHash(
const Seed&
seed,
48 const std::vector<unsigned>& queryAtomLabels,
49 const std::vector<unsigned>& queryBondLabels) {
50 size_t nv =
seed.getNumAtoms();
51 size_t ne =
seed.getNumBonds();
52 std::vector<unsigned long> currCodes(nv);
53 std::vector<unsigned long> prevCodes(nv);
54 size_t nIterations =
seed.getNumBonds();
55 if (nIterations > 5) nIterations = 5;
57 for (
unsigned seedAtomIdx = 0; seedAtomIdx <
seed.getNumAtoms();
59 currCodes[seedAtomIdx] =
60 queryAtomLabels[
seed.MoleculeFragment.AtomsIdx[seedAtomIdx]];
62 for (
size_t iter = 0; iter < nIterations; iter++) {
63 for (
size_t i = 0; i < nv; i++) prevCodes[i] = currCodes[i];
65 for (
size_t seedBondIdx = 0; seedBondIdx < ne; seedBondIdx++) {
66 const Bond* bond =
seed.MoleculeFragment.Bonds[seedBondIdx];
68 queryBondLabels[
seed.MoleculeFragment.BondsIdx[seedBondIdx]];
69 unsigned atom1 =
seed.MoleculeFragment.SeedAtomIdxMap
75 unsigned v1 = prevCodes[atom1];
76 unsigned v2 = prevCodes[atom2];
78 currCodes[atom1] += v2 * v2 + (v2 + 23) * (order + 1721);
79 currCodes[atom2] += v1 * v1 + (v1 + 23) * (order + 1721);
83 KeyNumericMetrics::TValue result = 0;
84 for (
unsigned seedAtomIdx = 0; seedAtomIdx < nv; seedAtomIdx++) {
85 unsigned long code = currCodes[seedAtomIdx];
86 result += code * (code + 6849) + 29;
89 NumericMetrics.
Value = result;
112 std::vector<TIndexEntry> ValueStorage;
113 std::map<KeyNumericMetrics::TValue, size_t> NumericIndex;
121 const std::vector<unsigned>& queryAtomLabels,
122 const std::vector<unsigned>& queryBondLabels,
125 std::map<KeyNumericMetrics::TValue, size_t>::const_iterator entryit =
127 if (NumericIndex.end() != entryit)
return &ValueStorage[entryit->second];
138 ValueStorage.emplace_back();
143 entry = &ValueStorage.back();
145 entry->push_back(
seed.Topology);
148 .insert(std::pair<KeyNumericMetrics::TValue, size_t>(
155 return ValueStorage.size();
160 for (std::vector<TIndexEntry>::const_iterator e = ValueStorage.begin();
161 e != ValueStorage.end(); e++)
class for representing a bond
unsigned int getBeginAtomIdx() const
returns the index of our begin Atom
unsigned int getEndAtomIdx() const
returns the index of our end Atom
std::list< FMCS::Graph > TIndexEntry
void add(const Seed &seed, TKey &key, TIndexEntry *entry)
TIndexEntry * find(const Seed &seed, const std::vector< unsigned > &queryAtomLabels, const std::vector< unsigned > &queryBondLabels, TKey &key)
#define RDKIT_FMCS_EXPORT
void computeKey(const Seed &seed, const std::vector< unsigned > &queryAtomLabels, const std::vector< unsigned > &queryBondLabels)
KeyNumericMetrics NumericMetrics
unsigned long long TValue