diff options
Diffstat (limited to 'model/rankaccu.cpp')
-rw-r--r-- | model/rankaccu.cpp | 81 |
1 files changed, 33 insertions, 48 deletions
diff --git a/model/rankaccu.cpp b/model/rankaccu.cpp index 726f2c8..f998e93 100644 --- a/model/rankaccu.cpp +++ b/model/rankaccu.cpp @@ -70,79 +70,64 @@ void rankmerge(int l,int r,vector<int> &C,vector<int> &rank,const vector<double> } } -void rank_accu(DataList &D,const vector<double> pred) +void rank_accu(RidList &D,const vector<double> pred) { unsigned long n = D.getSize(); vector<int> orig_rank(n),pred_rank(n),C(n); vector<double> orig(n); - vector<DataEntry*> &dat = D.getData(); int i,j; - for (i=0;i<dat.size();++i) + for (i=0;i<D.getSize();++i) { orig_rank[i]=i; pred_rank[i]=i; - orig[i]=dat[i]->rank; + orig[i]=D.getL(i); } - int cnt=0; double accu_nDCG=0; double accu_AP=0; - i=j=0; - while (i<dat.size()) + for (j=0; j<D.getSize();j+=D.getqSize()) { - if ((i+1 == dat.size())|| dat[i]->qid!=dat[i+1]->qid) + i=j+D.getqSize()-1; + double Y=0,Z=0; + double AP=0; + ranksort(j,i,orig_rank,orig,pred); + ranksort(j,i,pred_rank,pred,orig); + for (int k = j;k<=i;++k) { - double Y=0,Z=0; - double AP=0; - ranksort(j,i,orig_rank,orig,pred); - ranksort(j,i,pred_rank,pred,orig); - for (int k = j;k<=i;++k) - { - Z += (pow(2,offset+orig[orig_rank[k]]) - 1)/log2(2+k-j); - Y += (pow(2,offset+orig[pred_rank[k]]) - 1)/log2(2+k-j); - } - accu_nDCG+=Y/Z; - rankmerge(j,i,C,orig_rank,pred,orig); - for (int k = j+1;k<=i;++k) - AP += ((double)C[k])/(k-j); - AP=AP*2/(i-j)-1; - accu_AP+=AP; - j = i+1; - ++cnt; + Z += (pow(2,offset+orig[orig_rank[k]]) - 1)/log2(2+k-j); + Y += (pow(2,offset+orig[pred_rank[k]]) - 1)/log2(2+k-j); } - ++i; + accu_nDCG+=Y/Z; + rankmerge(j,i,C,orig_rank,pred,orig); + for (int k = j+1;k<=i;++k) + AP += ((double)C[k])/(k-j); + AP=AP*2/(i-j)-1; + accu_AP+=AP; } - LOG(INFO)<<"over "<< cnt<< " queries. "<<"Average nDGC: "<< accu_nDCG/cnt<< " Average AP: "<<accu_AP/cnt; + LOG(INFO)<<"over "<< D.getuSize()<< " queries. "<<"Average nDGC: "<< accu_nDCG/D.getuSize()<< " Average AP: "<<accu_AP/D.getuSize(); } -void rank_CMC(DataList &D,const std::vector<double> pred,CMC & cmc) { +void rank_CMC(RidList &D,const std::vector<double> pred,CMC & cmc) { unsigned long n = D.getSize(); vector<int> orig_rank(n),pred_rank(n); vector<double> orig(n); - vector<DataEntry*> &dat = D.getData(); int i,j; - for (i=0;i<dat.size();++i) + for (i=0;i<D.getSize();++i) { orig_rank[i]=i; pred_rank[i]=i; - orig[i]=dat[i]->rank; + orig[i]=D.getL(i); } - int cnt=0; - i=j=0; - while (i<dat.size()) + for (j=0; j<D.getSize();j+=D.getqSize()) { - if ((i+1 == dat.size())|| dat[i]->qid!=dat[i+1]->qid) - { - ranksort(j,i,pred_rank,pred,orig); - for (int k=j;k<=i;++k) - if (orig[pred_rank[k]]>0) - { - LOG(INFO)<<"qid:"<<dat[pred_rank[k]]->qid<<"; pred:"<<pred[k]<<"; rank:"<< k-j; - cmc.addEntry(k-j); - break; // account only for the first match; - } - j = i+1; - ++cnt; - } - ++i; + i=j+D.getqSize()-1; + ranksort(j,i,pred_rank,pred,orig); + for (int k=j;k<=i;++k) + if (orig[pred_rank[k]]>0) + { + LOG(INFO)<<"qid:"<<D.getQid(j)<<"; pred:"<<pred[k]<<"; rank:"<< k-j; + cmc.addEntry(k-j); + break; // account only for the first match; + } + j = i+1; } }
\ No newline at end of file |