add "distance" support; some code cleanup

This commit is contained in:
Greg Landrum
2008-04-24 09:04:50 +00:00
parent 1810d4ba18
commit 10faff5964
3 changed files with 135 additions and 106 deletions

View File

@@ -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");
}
};