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) {
59 for (
unsigned seedAtomIdx = 0; seedAtomIdx < seed.getNumAtoms();
61 currCodes[seedAtomIdx] =
62 queryAtomLabels[seed.MoleculeFragment.AtomsIdx[seedAtomIdx]];
65 for (
size_t iter = 0; iter < nIterations; iter++) {
66 for (
size_t i = 0; i < nv; i++) {
67 prevCodes[i] = currCodes[i];
70 for (
size_t seedBondIdx = 0; seedBondIdx < ne; seedBondIdx++) {
71 const Bond* bond = seed.MoleculeFragment.Bonds[seedBondIdx];
73 queryBondLabels[seed.MoleculeFragment.BondsIdx[seedBondIdx]];
74 unsigned atom1 = seed.MoleculeFragment.SeedAtomIdxMap
75 .find(bond->getBeginAtomIdx())
78 seed.MoleculeFragment.SeedAtomIdxMap.find(bond->getEndAtomIdx())
80 unsigned v1 = prevCodes[atom1];
81 unsigned v2 = prevCodes[atom2];
83 currCodes[atom1] += v2 * v2 + (v2 + 23) * (order + 1721);
84 currCodes[atom2] += v1 * v1 + (v1 + 23) * (order + 1721);
88 KeyNumericMetrics::TValue result = 0;
89 for (
unsigned seedAtomIdx = 0; seedAtomIdx < nv; seedAtomIdx++) {
90 unsigned long code = currCodes[seedAtomIdx];
91 result += code * (code + 6849) + 29;
94 NumericMetrics.
Value = result;
126 const std::vector<unsigned>& queryAtomLabels,
127 const std::vector<unsigned>& queryBondLabels,
129 key.
computeKey(seed, queryAtomLabels, queryBondLabels);
130 std::map<KeyNumericMetrics::TValue, size_t>::const_iterator entryit =
132 if (NumericIndex.end() != entryit) {
133 return &ValueStorage[entryit->second];
145 ValueStorage.emplace_back();
150 entry = &ValueStorage.back();
152 entry->push_back(seed.Topology);
155 .insert(std::pair<KeyNumericMetrics::TValue, size_t>(