diff options
Diffstat (limited to 'model')
| -rw-r--r-- | model/rankaccu.cpp | 31 | ||||
| -rw-r--r-- | model/rankaccu.h | 30 | 
2 files changed, 61 insertions, 0 deletions
diff --git a/model/rankaccu.cpp b/model/rankaccu.cpp index 069e245..1763e0f 100644 --- a/model/rankaccu.cpp +++ b/model/rankaccu.cpp @@ -112,4 +112,35 @@ int rank_accu(DataList &D,const vector<double> pred)          ++i;      }      LOG(INFO)<<"over "<< cnt<< " queries. "<<"Average nDGC: "<< accu_nDCG/cnt<< " Average AP: "<<accu_AP/cnt; +} + +int rank_CMC(DataList &D,const std::vector<double> pred,CMC & cmc) { +    unsigned long n = D.getSize(); +    vector<int> orig_rank(n),pred_rank(n),C(n); +    vector<double> orig(n); +    int i,j; +    for (i=0;i<D.getSize();++i) +    { +        orig_rank[i]=i; +        pred_rank[i]=i; +        orig[i]=D.getData()[i]->rank; +    } +    int cnt=0; +    i=j=0; +    while (i<D.getSize()) +    { +        if ((i+1 == D.getSize())|| D.getData()[i]->qid!=D.getData()[i+1]->qid) +        { +            ranksort(j,i,pred_rank,pred,orig); +            for (int k=j;k<=i;++k) +                if (orig[pred_rank[k]]>0) +                { +                    cmc.addEntry(k-j); +                    break; // account only for the first match; +                } +            j = i+1; +            ++cnt; +        } +        ++i; +    }  }
\ No newline at end of file diff --git a/model/rankaccu.h b/model/rankaccu.h index 3fe5379..adf1a1f 100644 --- a/model/rankaccu.h +++ b/model/rankaccu.h @@ -8,6 +8,36 @@  #include<vector>  #include"../tools/dataProvider.h" +#define CMC_MAX 100 + +class CMC +{ +private: +    std::vector<double> acc; +    int cnt; +public: +    void clear(){for (int i=0;i<CMC_MAX;++i) acc[i]=0; cnt=0;}; +    CMC(){acc.reserve(CMC_MAX); clear();}; +    void addEntry(int idx) { ++cnt; if (idx <CMC_MAX) acc[idx]+=1;} +    std::vector<double> getAcc() { +        std::vector<double> res; +        res.reserve(CMC_MAX); +        double cumu = 0; +        for (int i=0;i<CMC_MAX;++i) +        { +            cumu += acc[i]; +            res[i] = cumu / cnt; +        } +        return res; +    } +    int getCount() +    { +        return cnt; +    } +}; + +int rank_CMC(DataList &D,const std::vector<double> pred,CMC & cmc); +  int rank_accu(DataList &D,const std::vector<double> pred);  #endif //RANKSVM_RANKACCU_H  | 
