00001 #ifndef Impala_Core_Vector_Similarity_h
00002 #define Impala_Core_Vector_Similarity_h
00003
00004 #include "Core/Vector/VectorSet.h"
00005
00006 namespace Impala
00007 {
00008 namespace Core
00009 {
00010 namespace Vector
00011 {
00012
00013
00017 template <class ArrayT, class SimFuncT>
00018 inline Real64
00019 Similarity(VectorSet<ArrayT>* example, VectorSet<ArrayT>* src, int exStartIdx,
00020 int srcStartIdx, int setSize, SimFuncT simFunc)
00021 {
00022 Real64 score = 0;
00023 for (int i=0 ; i<setSize ; i++)
00024 score += simFunc(example->GetVector(exStartIdx + i, true),
00025 src->GetVector(srcStartIdx + i, true));
00026 return (score / setSize);
00027 }
00028
00029
00035 template <class ArrayT, class SimFuncT>
00036 inline void
00037 Similarity(Real64* dst, typename VectorSet<ArrayT>::VectorT example,
00038 VectorSet<ArrayT>* src, bool* filter, int subSetSize, SimFuncT simFunc)
00039 {
00040 int nrSubSets = src->Size() / subSetSize;
00041 for (int s=0 ; s<nrSubSets ; s++)
00042 {
00043 if (filter && (!filter[s]))
00044 continue;
00045 Real64 maxScore = -1;
00046 int srcIdx = s * subSetSize;
00047 for (int i=0 ; i<subSetSize ; i++)
00048 {
00049 typename VectorSet<ArrayT>::VectorT temp(src->GetVector(srcIdx + i, true));
00050 Real64 score = simFunc(example, temp);
00051 if (score > maxScore)
00052 maxScore = score;
00053 }
00054 dst[s] = maxScore;
00055 }
00056 }
00057
00058
00071 template <class ArrayT, class SimFuncT>
00072 inline void
00073 Similarity(VectorTem<Real64>* dst, VectorSet<ArrayT>* example,
00074 VectorSet<ArrayT>* src, bool* filter, int subSetSize,
00075 int subSubSetSize, int activeSubSubSet, bool doMax, SimFuncT simFunc)
00076 {
00077 int nrSubSets = src->Size() / subSetSize;
00078 int nrSubSubSet = 1;
00079 bool reUseEx = false;
00080 if ((subSetSize != subSubSetSize) && (example->Size() == subSubSetSize))
00081 reUseEx = true;
00082 nrSubSubSet = subSetSize / subSubSetSize;
00083 for (int s=0 ; s<nrSubSets ; s++)
00084 {
00085 if (filter && (!filter[s]))
00086 continue;
00087 Real64 totScore = 0;
00088 int srcBase = s * subSetSize;
00089 int exBase = 0;
00090 for (int ss=0 ; ss<nrSubSubSet ; ss++)
00091 {
00092 Real64 score = Similarity(example, src, exBase, srcBase,
00093 subSubSetSize, simFunc);
00094 srcBase += subSubSetSize;
00095 if (!reUseEx)
00096 exBase += subSubSetSize;
00097 totScore = (doMax) ? Max(totScore, score) : totScore + score;
00098 }
00099 if (!doMax)
00100 totScore /= nrSubSubSet;
00101 dst->Elem(s) = totScore;
00102 }
00103 }
00104
00105 }
00106 }
00107 }
00108
00109 #endif