15 #include "../RDKitBase.h" 38 void computeKey (
const Seed& seed,
const std::vector<unsigned>& queryAtomLabels,
const std::vector<unsigned>& queryBondLabels) {
39 computeMorganCodeHash(seed, queryAtomLabels, queryBondLabels);
42 void computeMorganCodeHash(
const Seed& seed
43 ,
const std::vector<unsigned>& queryAtomLabels,
const std::vector<unsigned>& queryBondLabels) {
46 std::vector<unsigned long> currCodes(nv);
47 std::vector<unsigned long> prevCodes(nv);
52 for(
unsigned seedAtomIdx = 0; seedAtomIdx < seed.
getNumAtoms(); seedAtomIdx++)
55 for (
size_t iter = 0; iter < nIterations; iter++) {
56 for (
size_t i = 0; i < nv; i++)
57 prevCodes[i] = currCodes[i];
59 for (
size_t seedBondIdx= 0; seedBondIdx< ne; seedBondIdx++) {
64 unsigned v1 = prevCodes[atom1];
65 unsigned v2 = prevCodes[atom2];
67 currCodes[atom1] += v2*v2 + (v2 + 23) * (order + 1721);
68 currCodes[atom2] += v1*v1 + (v1 + 23) * (order + 1721);
73 for(
unsigned seedAtomIdx = 0; seedAtomIdx < nv; seedAtomIdx++) {
74 unsigned long code = currCodes[seedAtomIdx];
75 result += code * (code + 6849) + 29;
78 NumericMetrics.
Value = result;
100 std::vector<TIndexEntry> ValueStorage;
101 std::map<KeyNumericMetrics::TValue, size_t> NumericIndex;
106 TIndexEntry*
find(
const Seed& seed,
const std::vector<unsigned>& queryAtomLabels
107 ,
const std::vector<unsigned>& queryBondLabels
109 key.
computeKey(seed, queryAtomLabels, queryBondLabels);
110 std::map<KeyNumericMetrics::TValue, size_t>::const_iterator
112 if(NumericIndex.end() != entryit)
113 return & ValueStorage[entryit->second];
118 void add(
const Seed& seed, TKey& key, TIndexEntry* entry) {
125 entry = &ValueStorage.back();
129 if(!NumericIndex.insert( std::pair<KeyNumericMetrics::TValue, size_t>(key.
NumericMetrics.
Value, ValueStorage.size()-1) ).second)
135 return ValueStorage.size();
140 for(std::vector<TIndexEntry>::const_iterator e = ValueStorage.begin(); e != ValueStorage.end(); e++)
void computeKey(const Seed &seed, const std::vector< unsigned > &queryAtomLabels, const std::vector< unsigned > &queryBondLabels)
std::vector< unsigned > BondsIdx
KeyNumericMetrics NumericMetrics
std::map< unsigned, unsigned > SeedAtomIdxMap
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
Includes a bunch of functionality for handling Atom and Bond queries.
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