00001
00002
00003
00004
00005
00006 #ifndef __RD_BITOPS_H__
00007 #define __RD_BITOPS_H__
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "BitVects.h"
00020 #include <string>
00021
00022
00023
00024
00025 template <typename T>
00026 double SimilarityWrapper(const T &bv1,const T &bv2,
00027 const double (*metric)(const T &,const T &),
00028 bool returnDistance=false){
00029 double res=0.0;
00030 if(bv1.GetNumBits()>bv2.GetNumBits()){
00031 T *bv1tmp = FoldFingerprint(bv1,bv1.GetNumBits()/bv2.GetNumBits());
00032 res = metric(*bv1tmp,bv2);
00033 delete bv1tmp;
00034 } else if(bv2.GetNumBits()>bv1.GetNumBits()){
00035 T *bv2tmp = FoldFingerprint(bv2,bv2.GetNumBits()/bv1.GetNumBits());
00036 res = metric(bv1,*bv2tmp);
00037 delete bv2tmp;
00038 } else {
00039 res = metric(bv1,bv2);
00040 }
00041 if(returnDistance) res = 1.0-res;
00042 return res;
00043 }
00044
00045 template <typename T>
00046 double SimilarityWrapper(const T &bv1,const T &bv2,double a,double b,
00047 const double (*metric)(const T &,const T &,double,double),
00048 bool returnDistance=false){
00049 double res=0.0;
00050 if(bv1.GetNumBits()>bv2.GetNumBits()){
00051 T *bv1tmp = FoldFingerprint(bv1,bv1.GetNumBits()/bv2.GetNumBits());
00052 res = metric(*bv1tmp,bv2,a,b);
00053 delete bv1tmp;
00054 } else if(bv2.GetNumBits()>bv1.GetNumBits()){
00055 T *bv2tmp = FoldFingerprint(bv2,bv2.GetNumBits()/bv1.GetNumBits());
00056 res = metric(bv1,*bv2tmp,a,b);
00057 delete bv2tmp;
00058 } else {
00059 res = metric(bv1,bv2,a,b);
00060 }
00061 if(returnDistance) res = 1.0-res;
00062 return res;
00063 }
00064
00065
00066 bool AllProbeBitsMatch(const char *probe,const char *ref);
00067 bool AllProbeBitsMatch(const std::string &probe,const std::string &ref);
00068
00069
00070 template <typename T1>
00071 bool AllProbeBitsMatch(const T1 &probe,const std::string &pkl);
00072
00073
00074
00075
00076
00077
00078 template <typename T1, typename T2>
00079 int
00080 NumOnBitsInCommon(const T1& bv1,const T2& bv2);
00081
00082 int
00083 NumOnBitsInCommon(const ExplicitBitVect & bv1,const ExplicitBitVect & bv2);
00084
00085
00086
00087
00088
00089 template <typename T1, typename T2>
00090 const double
00091 TanimotoSimilarity(const T1& bv1,const T2& bv2);
00092
00093
00094
00095
00096
00097 template <typename T1, typename T2>
00098 const double
00099 CosineSimilarity(const T1& bv1,
00100 const T2& bv2);
00101
00102
00103
00104
00105
00106 template <typename T1, typename T2>
00107 const double
00108 KulczynskiSimilarity(const T1& bv1,
00109 const T2& bv2);
00110
00111
00112
00113
00114
00115 template <typename T1, typename T2>
00116 const double
00117 DiceSimilarity(const T1& bv1,
00118 const T2& bv2);
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130 template <typename T1, typename T2>
00131 const double
00132 TverskySimilarity(const T1& bv1,
00133 const T2& bv2,double a,double b);
00134
00135
00136
00137
00138
00139 template <typename T1, typename T2>
00140 const double
00141 SokalSimilarity(const T1& bv1,
00142 const T2& bv2);
00143
00144
00145
00146
00147
00148 template <typename T1, typename T2>
00149 const double
00150 McConnaugheySimilarity(const T1& bv1,
00151 const T2& bv2);
00152
00153
00154
00155
00156
00157 template <typename T1, typename T2>
00158 const double
00159 AsymmetricSimilarity(const T1& bv1,
00160 const T2& bv2);
00161
00162
00163
00164
00165
00166 template <typename T1, typename T2>
00167 const double
00168 BraunBlanquetSimilarity(const T1& bv1,
00169 const T2& bv2);
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179 template <typename T1, typename T2>
00180 const double
00181 RusselSimilarity(const T1& bv1,
00182 const T2& bv2);
00183
00184
00185
00186
00187
00188
00189 template <typename T1, typename T2>
00190 const double
00191 OnBitSimilarity(const T1& bv1,const T2& bv2);
00192
00193
00194
00195
00196
00197 template <typename T1, typename T2>
00198 const int
00199 NumBitsInCommon(const T1& bv1,const T2& bv2);
00200
00201
00202
00203
00204
00205 template <typename T1, typename T2>
00206 const double
00207 AllBitSimilarity(const T1& bv1,const T2& bv2);
00208
00209
00210 template <typename T1, typename T2>
00211 IntVect
00212 OnBitsInCommon(const T1& bv1,const T2& bv2);
00213
00214
00215 template <typename T1, typename T2>
00216 IntVect
00217 OffBitsInCommon(const T1& bv1,const T2& bv2);
00218
00219
00220
00221
00222
00223
00224
00225 template <typename T1, typename T2>
00226 DoubleVect
00227 OnBitProjSimilarity(const T1& bv1,const T2& bv2);
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238 template <typename T1, typename T2>
00239 DoubleVect
00240 OffBitProjSimilarity(const T1& bv1,const T2& bv2);
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253 template <typename T1>
00254 T1 *
00255 FoldFingerprint(const T1& bv1,unsigned int factor=2);
00256
00257
00258
00259
00260
00261
00262
00263
00264 template <typename T1>
00265 std::string
00266 BitVectToText(const T1& bv1);
00267
00268
00269
00270 #endif