// // Created by joe on 4/12/15. // #include "rankaccu.h" #include "../tools/easylogging++.h" using namespace std; const double offset = 1; void ranksort(int l,int r,vector &rank,const vector &ref1,const vector &ref2) { int i=l,j=r,k; double mid1=ref1[rank[(l+r)>>1]],mid2=ref2[rank[(l+r)>>1]]; while (i<=j) { while (ref1[rank[i]]>mid1 || (ref1[rank[i]]==mid1 && ref2[rank[i]]>mid2)) ++i; while (ref1[rank[j]]l) ranksort(l,j,rank,ref1,ref2); if (i pred) { unsigned long n = D.getSize(); vector orig_rank(n),pred_rank(n); vector orig(n); int i,j; for (i=0;irank; } int cnt=0; double accu_nDCG=0; i=j=0; while (iqid!=D.getData()[i+1]->qid) { double Y=0,Z=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; j = i+1; ++cnt; } ++i; } LOG(INFO)<<"Average nDGC over "<< cnt<< " queries: "<< accu_nDCG/cnt; }