#include #include #include #include #include #include namespace { class taniFunctor { public: taniFunctor(const std::vector &ebvs) : d_ebvs(ebvs) {} double operator()(unsigned int i,unsigned int j) { double res; 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; } return res; } private: 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()){ if(nToPick>=ebvs.size()) throw ValueErrorException("nToPick is larger than the vector size"); std::vector res; RDPickers::MaxMinPicker picker; taniFunctor ftor(ebvs); res = picker.lazyPick(ftor,ebvs.size(),nToPick,firstPicks,seed); return res; }