#include #include #include #include #include #include namespace { class taniFunctor { public: taniFunctor(const std::vector &ebvs, bool useCache) : df_useCache(useCache), d_ebvs(ebvs) {} double operator()(unsigned int i, unsigned int j) { double res; if(df_useCache){ std::pair idxPair(i, j); if (this->d_cache.count(idxPair) > 0) { res = this->d_cache[idxPair]; } else { res = 1. - TanimotoSimilarity(d_ebvs[i], d_ebvs[j]); this->d_cache[idxPair] = res; } } else { res = 1. - TanimotoSimilarity(d_ebvs[i], d_ebvs[j]); } return res; } private: bool df_useCache; const std::vector &d_ebvs; std::map, double> d_cache; }; } std::vector pickUsingFingerprints( const std::vector &ebvs, unsigned int nToPick, int seed = -1, std::vector firstPicks = std::vector(), bool useCache=true) { if (nToPick >= ebvs.size()) throw ValueErrorException("nToPick is larger than the vector size"); std::vector res; RDPickers::MaxMinPicker picker; taniFunctor ftor(ebvs,useCache); res = picker.lazyPick(ftor, ebvs.size(), nToPick, firstPicks, seed); return res; }