mirror of
https://github.com/rdkit/rdkit.git
synced 2026-06-05 22:04:27 +08:00
add "distance" support; some code cleanup
This commit is contained in:
@@ -32,15 +32,15 @@ EBV *ff2(const EBV &ev1, int factor=2) {
|
||||
|
||||
template <typename T>
|
||||
double SimilarityWrapper(const T &bv1,const std::string &pkl,
|
||||
const double (*metric)(const T &,const T &)){
|
||||
double res=0.0;
|
||||
const double (*metric)(const T &,const T &),bool returnDistance){
|
||||
T bv2(pkl);
|
||||
return SimilarityWrapper(bv1,bv2,metric);
|
||||
return SimilarityWrapper(bv1,bv2,metric,returnDistance);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
python::list BulkWrapper(const T &bv1,python::list bvs,
|
||||
const double (*metric)(const T &,const T &)){
|
||||
const double (*metric)(const T &,const T &),
|
||||
bool returnDistance){
|
||||
python::list res;
|
||||
unsigned int nbvs=python::extract<unsigned int>(bvs.attr("__len__")());
|
||||
for(unsigned int i=0;i<nbvs;++i){
|
||||
@@ -57,125 +57,141 @@ python::list BulkWrapper(const T &bv1,python::list bvs,
|
||||
} else {
|
||||
simVal = metric(bv1,bv2);
|
||||
}
|
||||
if(returnDistance) simVal = 1.-simVal;
|
||||
res.append(simVal);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
double TanimotoSimilarity_w(const T &bv1,const std::string &pkl){
|
||||
return SimilarityWrapper(bv1,pkl,
|
||||
(const double (*)(const T&,const T&))TanimotoSimilarity);
|
||||
template <typename T1, typename T2>
|
||||
double TanimotoSimilarity_w(const T1 &bv1,const T2 &bv2,bool returnDistance){
|
||||
return SimilarityWrapper(bv1,bv2,
|
||||
(const double (*)(const T1&,const T1&))TanimotoSimilarity,
|
||||
returnDistance);
|
||||
}
|
||||
template <typename T>
|
||||
python::list BulkTanimotoSimilarity(const T &bv1,python::list bvs){
|
||||
python::list BulkTanimotoSimilarity(const T &bv1,python::list bvs,bool returnDistance){
|
||||
return BulkWrapper(bv1,bvs,
|
||||
(const double (*)(const T&,const T&))TanimotoSimilarity);
|
||||
(const double (*)(const T&,const T&))TanimotoSimilarity,
|
||||
returnDistance);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
double CosineSimilarity_w(const T &bv1,const std::string &pkl){
|
||||
return SimilarityWrapper(bv1,pkl,
|
||||
(const double (*)(const T&,const T&))CosineSimilarity);
|
||||
template <typename T1, typename T2>
|
||||
double CosineSimilarity_w(const T1 &bv1,const T2 &bv2,bool returnDistance){
|
||||
return SimilarityWrapper(bv1,bv2,
|
||||
(const double (*)(const T1&,const T1&))CosineSimilarity,
|
||||
returnDistance);
|
||||
}
|
||||
template <typename T>
|
||||
python::list BulkCosineSimilarity(const T &bv1,python::list bvs){
|
||||
python::list BulkCosineSimilarity(const T &bv1,python::list bvs,bool returnDistance){
|
||||
return BulkWrapper(bv1,bvs,
|
||||
(const double (*)(const T&,const T&))CosineSimilarity);
|
||||
(const double (*)(const T&,const T&))CosineSimilarity,
|
||||
returnDistance);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
double KulczynskiSimilarity_w(const T &bv1,const std::string &pkl){
|
||||
return SimilarityWrapper(bv1,pkl,
|
||||
(const double (*)(const T&,const T&))KulczynskiSimilarity);
|
||||
template <typename T1, typename T2>
|
||||
double KulczynskiSimilarity_w(const T1 &bv1,const T2 &bv2,bool returnDistance){
|
||||
return SimilarityWrapper(bv1,bv2,
|
||||
(const double (*)(const T1&,const T1&))KulczynskiSimilarity,
|
||||
returnDistance);
|
||||
}
|
||||
template <typename T>
|
||||
python::list BulkKulczynskiSimilarity(const T &bv1,python::list bvs){
|
||||
python::list BulkKulczynskiSimilarity(const T &bv1,python::list bvs,bool returnDistance){
|
||||
return BulkWrapper(bv1,bvs,
|
||||
(const double (*)(const T&,const T&))KulczynskiSimilarity);
|
||||
(const double (*)(const T&,const T&))KulczynskiSimilarity,
|
||||
returnDistance);
|
||||
}
|
||||
|
||||
|
||||
template <typename T>
|
||||
double DiceSimilarity_w(const T &bv1,const std::string &pkl){
|
||||
return SimilarityWrapper(bv1,pkl,
|
||||
(const double (*)(const T&,const T&))DiceSimilarity);
|
||||
template <typename T1, typename T2>
|
||||
double DiceSimilarity_w(const T1 &bv1,const T2 &bv2,bool returnDistance){
|
||||
return SimilarityWrapper(bv1,bv2,
|
||||
(const double (*)(const T1&,const T1&))DiceSimilarity,
|
||||
returnDistance);
|
||||
}
|
||||
template <typename T>
|
||||
python::list BulkDiceSimilarity(const T &bv1,python::list bvs){
|
||||
python::list BulkDiceSimilarity(const T &bv1,python::list bvs,bool returnDistance){
|
||||
return BulkWrapper(bv1,bvs,
|
||||
(const double (*)(const T&,const T&))DiceSimilarity);
|
||||
(const double (*)(const T&,const T&))DiceSimilarity,
|
||||
returnDistance);
|
||||
}
|
||||
|
||||
|
||||
template <typename T>
|
||||
double SokalSimilarity_w(const T &bv1,const std::string &pkl){
|
||||
return SimilarityWrapper(bv1,pkl,
|
||||
(const double (*)(const T&,const T&))SokalSimilarity);
|
||||
template <typename T1, typename T2>
|
||||
double SokalSimilarity_w(const T1 &bv1,const T2 &bv2,bool returnDistance){
|
||||
return SimilarityWrapper(bv1,bv2,
|
||||
(const double (*)(const T1&,const T1&))SokalSimilarity,
|
||||
returnDistance);
|
||||
}
|
||||
template <typename T>
|
||||
python::list BulkSokalSimilarity(const T &bv1,python::list bvs){
|
||||
python::list BulkSokalSimilarity(const T &bv1,python::list bvs,bool returnDistance){
|
||||
return BulkWrapper(bv1,bvs,
|
||||
(const double (*)(const T&,const T&))SokalSimilarity);
|
||||
(const double (*)(const T&,const T&))SokalSimilarity,
|
||||
returnDistance);
|
||||
}
|
||||
|
||||
|
||||
template <typename T>
|
||||
double McConnaugheySimilarity_w(const T &bv1,const std::string &pkl){
|
||||
return SimilarityWrapper(bv1,pkl,
|
||||
(const double (*)(const T&,const T&))McConnaugheySimilarity);
|
||||
template <typename T1, typename T2>
|
||||
double McConnaugheySimilarity_w(const T1 &bv1,const T2 &bv2,bool returnDistance){
|
||||
return SimilarityWrapper(bv1,bv2,
|
||||
(const double (*)(const T1&,const T1&))McConnaugheySimilarity,
|
||||
returnDistance);
|
||||
}
|
||||
template <typename T>
|
||||
python::list BulkMcConnaugheySimilarity(const T &bv1,python::list bvs){
|
||||
python::list BulkMcConnaugheySimilarity(const T &bv1,python::list bvs,bool returnDistance){
|
||||
return BulkWrapper(bv1,bvs,
|
||||
(const double (*)(const T&,const T&))McConnaugheySimilarity);
|
||||
(const double (*)(const T&,const T&))McConnaugheySimilarity,
|
||||
returnDistance);
|
||||
}
|
||||
|
||||
|
||||
template <typename T>
|
||||
double AsymmetricSimilarity_w(const T &bv1,const std::string &pkl){
|
||||
return SimilarityWrapper(bv1,pkl,
|
||||
(const double (*)(const T&,const T&))AsymmetricSimilarity);
|
||||
template <typename T1, typename T2>
|
||||
double AsymmetricSimilarity_w(const T1 &bv1,const T2 &bv2,bool returnDistance){
|
||||
return SimilarityWrapper(bv1,bv2,
|
||||
(const double (*)(const T1&,const T1&))AsymmetricSimilarity,
|
||||
returnDistance);
|
||||
}
|
||||
template <typename T>
|
||||
python::list BulkAsymmetricSimilarity(const T &bv1,python::list bvs){
|
||||
python::list BulkAsymmetricSimilarity(const T &bv1,python::list bvs,bool returnDistance){
|
||||
return BulkWrapper(bv1,bvs,
|
||||
(const double (*)(const T&,const T&))AsymmetricSimilarity);
|
||||
(const double (*)(const T&,const T&))AsymmetricSimilarity,
|
||||
returnDistance);
|
||||
}
|
||||
|
||||
|
||||
template <typename T>
|
||||
double BraunBlanquetSimilarity_w(const T &bv1,const std::string &pkl){
|
||||
return SimilarityWrapper(bv1,pkl,
|
||||
(const double (*)(const T&,const T&))BraunBlanquetSimilarity);
|
||||
template <typename T1, typename T2>
|
||||
double BraunBlanquetSimilarity_w(const T1 &bv1,const T2 &bv2,bool returnDistance){
|
||||
return SimilarityWrapper(bv1,bv2,
|
||||
(const double (*)(const T1&,const T1&))BraunBlanquetSimilarity,
|
||||
returnDistance);
|
||||
}
|
||||
template <typename T>
|
||||
python::list BulkBraunBlanquetSimilarity(const T &bv1,python::list bvs){
|
||||
python::list BulkBraunBlanquetSimilarity(const T &bv1,python::list bvs,bool returnDistance){
|
||||
return BulkWrapper(bv1,bvs,
|
||||
(const double (*)(const T&,const T&))BraunBlanquetSimilarity);
|
||||
(const double (*)(const T&,const T&))BraunBlanquetSimilarity,
|
||||
returnDistance);
|
||||
}
|
||||
|
||||
|
||||
template <typename T>
|
||||
double RusselSimilarity_w(const T &bv1,const std::string &pkl){
|
||||
return SimilarityWrapper(bv1,pkl,
|
||||
(const double (*)(const T&,const T&))RusselSimilarity);
|
||||
template <typename T1, typename T2>
|
||||
double RusselSimilarity_w(const T1 &bv1,const T2 &bv2,bool returnDistance){
|
||||
return SimilarityWrapper(bv1,bv2,
|
||||
(const double (*)(const T1&,const T1&))RusselSimilarity,
|
||||
returnDistance);
|
||||
}
|
||||
template <typename T>
|
||||
python::list BulkRusselSimilarity(const T &bv1,python::list bvs){
|
||||
python::list BulkRusselSimilarity(const T &bv1,python::list bvs,bool returnDistance){
|
||||
return BulkWrapper(bv1,bvs,
|
||||
(const double (*)(const T&,const T&))RusselSimilarity);
|
||||
(const double (*)(const T&,const T&))RusselSimilarity,
|
||||
returnDistance);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
python::list BulkOnBitSimilarity(const T &bv1,python::list bvs){
|
||||
python::list BulkOnBitSimilarity(const T &bv1,python::list bvs,bool returnDistance){
|
||||
return BulkWrapper(bv1,bvs,
|
||||
(const double (*)(const T&,const T&))OnBitSimilarity);
|
||||
(const double (*)(const T&,const T&))OnBitSimilarity,
|
||||
returnDistance);
|
||||
}
|
||||
template <typename T>
|
||||
python::list BulkAllBitSimilarity(const T &bv1,python::list bvs){
|
||||
python::list BulkAllBitSimilarity(const T &bv1,python::list bvs,bool returnDistance){
|
||||
return BulkWrapper(bv1,bvs,
|
||||
(const double (*)(const T&,const T&))AllBitSimilarity);
|
||||
(const double (*)(const T&,const T&))AllBitSimilarity,
|
||||
returnDistance);
|
||||
}
|
||||
|
||||
|
||||
@@ -183,48 +199,59 @@ BOOST_PYTHON_FUNCTION_OVERLOADS(sbv_fold_overloads, ff1, 1, 2);
|
||||
BOOST_PYTHON_FUNCTION_OVERLOADS(ebv_fold_overloads, ff2, 1, 2);
|
||||
|
||||
#define DBL_DEF(_funcname_,_bulkname_,_help_) \
|
||||
python::def( # _funcname_,(const double (*)(const SBV &,const SBV &))_funcname_); \
|
||||
python::def( # _funcname_,(const double (*)(const EBV &,const EBV &))_funcname_,_help_);\
|
||||
python::def( # _bulkname_,(python::list (*)(const EBV &,python::list))_bulkname_);\
|
||||
python::def( # _bulkname_,(python::list (*)(const EBV &,python::list))_bulkname_,_help_);
|
||||
python::def( # _funcname_,(const double (*)(const SBV &,const SBV &))_funcname_,\
|
||||
(python::args("v1"),python::args("v2"))); \
|
||||
python::def( # _funcname_,(const double (*)(const EBV &,const EBV &))_funcname_,\
|
||||
(python::args("v1"),python::args("v2")),_help_);\
|
||||
python::def( # _bulkname_,(python::list (*)(const EBV &,python::list,bool))_bulkname_,\
|
||||
(python::args("v1"),python::args("v2"),python::args("returnDistance")=0));\
|
||||
python::def( # _bulkname_,(python::list (*)(const EBV &,python::list,bool))_bulkname_,\
|
||||
(python::args("v1"),python::args("v2"),python::args("returnDistance")=0),_help_);
|
||||
|
||||
|
||||
#define BIG_DEF(_funcname_,_name_w_,_bulkname_,_help_) \
|
||||
python::def( # _funcname_,(const double (*)(const SBV &,const SBV &))_funcname_); \
|
||||
python::def( # _funcname_,(const double (*)(const EBV &,const EBV &))_funcname_,_help_);\
|
||||
python::def( # _funcname_,(double (*)(const SBV &,const std::string &))_name_w_);\
|
||||
python::def( # _funcname_,(double (*)(const EBV &,const std::string &))_name_w_,_help_);\
|
||||
python::def( # _bulkname_,(python::list (*)(const SBV &,python::list))_bulkname_);\
|
||||
python::def( # _bulkname_,(python::list (*)(const EBV &,python::list))_bulkname_,_help_);
|
||||
python::def( # _funcname_,(double (*)(const SBV &,const SBV &,bool))_name_w_,\
|
||||
(python::args("bv1"),python::args("bv2"),python::args("returnDistance")=0)); \
|
||||
python::def( # _funcname_,(double (*)(const EBV &,const EBV &,bool))_name_w_,\
|
||||
(python::args("bv1"),python::args("bv2"),python::args("returnDistance")=0),_help_);\
|
||||
python::def( # _funcname_,(double (*)(const SBV &,const std::string &,bool))_name_w_,\
|
||||
(python::args("bv1"),python::args("pkl"),python::args("returnDistance")=0));\
|
||||
python::def( # _funcname_,(double (*)(const EBV &,const std::string &,bool))_name_w_,\
|
||||
(python::args("bv1"),python::args("pkl"),python::args("returnDistance")=0),_help_);\
|
||||
python::def( # _bulkname_,(python::list (*)(const SBV &,python::list,bool))_bulkname_,\
|
||||
(python::args("bv1"),python::args("bvList"),python::args("returnDistance")=0));\
|
||||
python::def( # _bulkname_,(python::list (*)(const EBV &,python::list,bool))_bulkname_,\
|
||||
(python::args("bv1"),python::args("bvList"),python::args("returnDistance")=0),_help_);
|
||||
|
||||
struct BitOps_wrapper {
|
||||
static void wrap(){
|
||||
BIG_DEF(TanimotoSimilarity,TanimotoSimilarity_w,BulkTanimotoSimilarity,
|
||||
"B(bv1&bv2) / (B(bv1) + B(bv2) - B(bv1&bv2))")
|
||||
BIG_DEF(CosineSimilarity,CosineSimilarity_w,BulkCosineSimilarity,
|
||||
"B(bv1&bv2) / sqrt(B(bv1) * B(bv2))")
|
||||
BIG_DEF(KulczynskiSimilarity,KulczynskiSimilarity_w,BulkKulczynskiSimilarity,
|
||||
"B(bv1&bv2)*(B(bv1) + B(bv2)) / (2 * B(bv1) * B(bv2))")
|
||||
BIG_DEF(DiceSimilarity,DiceSimilarity_w,BulkDiceSimilarity,
|
||||
"2*B(bv1&bv2) / (B(bv1) + B(bv2))")
|
||||
BIG_DEF(SokalSimilarity,SokalSimilarity_w,BulkSokalSimilarity,
|
||||
"B(bv1&bv2) / (2*B(bv1) + 2*B(bv2) - 3*B(bv1&bv2))")
|
||||
BIG_DEF(CosineSimilarity,CosineSimilarity_w,BulkCosineSimilarity,
|
||||
"B(bv1&bv2) / sqrt(B(bv1) * B(bv2))")
|
||||
BIG_DEF(KulczynskiSimilarity,KulczynskiSimilarity_w,BulkKulczynskiSimilarity,
|
||||
"B(bv1&bv2)*(B(bv1) + B(bv2)) / (2 * B(bv1) * B(bv2))")
|
||||
BIG_DEF(DiceSimilarity,DiceSimilarity_w,BulkDiceSimilarity,
|
||||
"2*B(bv1&bv2) / (B(bv1) + B(bv2))")
|
||||
BIG_DEF(SokalSimilarity,SokalSimilarity_w,BulkSokalSimilarity,
|
||||
"B(bv1&bv2) / (2*B(bv1) + 2*B(bv2) - 3*B(bv1&bv2))")
|
||||
|
||||
BIG_DEF(McConnaugheySimilarity,McConnaugheySimilarity_w,BulkMcConnaugheySimilarity,
|
||||
"(B(bv1&bv2) * (B(bv1)+B(bv2)) - B(bv1)*B(bv2)) / (B(bv1) * B(bv2))")
|
||||
BIG_DEF(AsymmetricSimilarity,AsymmetricSimilarity_w,BulkAsymmetricSimilarity,
|
||||
"B(bv1&bv2) / min(B(bv1),B(bv2))")
|
||||
BIG_DEF(BraunBlanquetSimilarity,BraunBlanquetSimilarity_w,BulkBraunBlanquetSimilarity,
|
||||
"B(bv1&bv2) / max(B(bv1),B(bv2))")
|
||||
BIG_DEF(RusselSimilarity,RusselSimilarity_w,BulkRusselSimilarity,
|
||||
"B(bv1&bv2) / B(bv1)")
|
||||
BIG_DEF(McConnaugheySimilarity,McConnaugheySimilarity_w,BulkMcConnaugheySimilarity,
|
||||
"(B(bv1&bv2) * (B(bv1)+B(bv2)) - B(bv1)*B(bv2)) / (B(bv1) * B(bv2))")
|
||||
BIG_DEF(AsymmetricSimilarity,AsymmetricSimilarity_w,BulkAsymmetricSimilarity,
|
||||
"B(bv1&bv2) / min(B(bv1),B(bv2))")
|
||||
BIG_DEF(BraunBlanquetSimilarity,BraunBlanquetSimilarity_w,BulkBraunBlanquetSimilarity,
|
||||
"B(bv1&bv2) / max(B(bv1),B(bv2))")
|
||||
BIG_DEF(RusselSimilarity,RusselSimilarity_w,BulkRusselSimilarity,
|
||||
"B(bv1&bv2) / B(bv1)")
|
||||
|
||||
DBL_DEF(OnBitSimilarity,BulkOnBitSimilarity,
|
||||
"B(bv1&bv2) / B(bv1|bv2)")
|
||||
DBL_DEF(AllBitSimilarity,BulkAllBitSimilarity,
|
||||
"(B(bv1) - B(bv1^bv2)) / B(bv1)")
|
||||
python::def("OnBitProjSimilarity",
|
||||
(DoubleVect (*)(const SBV&,const SBV&))OnBitProjSimilarity);
|
||||
DBL_DEF(OnBitSimilarity,BulkOnBitSimilarity,
|
||||
"B(bv1&bv2) / B(bv1|bv2)")
|
||||
DBL_DEF(AllBitSimilarity,BulkAllBitSimilarity,
|
||||
"(B(bv1) - B(bv1^bv2)) / B(bv1)")
|
||||
|
||||
python::def("OnBitProjSimilarity",
|
||||
(DoubleVect (*)(const SBV&,const SBV&))OnBitProjSimilarity);
|
||||
python::def("OnBitProjSimilarity",
|
||||
(DoubleVect (*)(const EBV&,const EBV&))OnBitProjSimilarity,
|
||||
"Returns a 2-tuple: (B(bv1&bv2) / B(bv1), B(bv1&bv2) / B(bv2))");
|
||||
@@ -263,9 +290,9 @@ struct BitOps_wrapper {
|
||||
)[python::return_value_policy<python::manage_new_object>()]);
|
||||
|
||||
python::def("AllProbeBitsMatch",
|
||||
(bool (*)(const SBV &,const std::string &))AllProbeBitsMatch);
|
||||
(bool (*)(const SBV &,const std::string &))AllProbeBitsMatch);
|
||||
python::def("AllProbeBitsMatch",(bool (*)(const EBV &,const std::string &))AllProbeBitsMatch,
|
||||
"Returns True if all bits in the first argument match all bits in the \n\
|
||||
"Returns True if all bits in the first argument match all bits in the \n\
|
||||
vector defined by the pickle in the second argument.\n");
|
||||
|
||||
python::def("BitVectToText",
|
||||
@@ -274,10 +301,6 @@ struct BitOps_wrapper {
|
||||
(std::string (*)(const EBV&))BitVectToText,
|
||||
"Returns a string of zeros and ones representing the bit vector."
|
||||
);
|
||||
|
||||
python::def("BulkTanimotoSimilarity",(python::list (*)(const SBV &,python::list))BulkTanimotoSimilarity);
|
||||
python::def("BulkTanimotoSimilarity",(python::list (*)(const EBV &,python::list))BulkTanimotoSimilarity,
|
||||
"returns a list of similarity values");
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user