summaryrefslogtreecommitdiff
path: root/model
diff options
context:
space:
mode:
Diffstat (limited to 'model')
-rw-r--r--model/rankaccu.cpp81
-rw-r--r--model/rankaccu.h4
-rw-r--r--model/ranksvm.h2
-rw-r--r--model/ranksvmtn.cpp26
-rw-r--r--model/ranksvmtn.h2
5 files changed, 52 insertions, 63 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
diff --git a/model/rankaccu.h b/model/rankaccu.h
index bcb8906..832a9f5 100644
--- a/model/rankaccu.h
+++ b/model/rankaccu.h
@@ -36,8 +36,8 @@ public:
}
};
-void rank_CMC(DataList &D,const std::vector<double> pred,CMC & cmc);
+void rank_CMC(RidList &D,const std::vector<double> pred,CMC & cmc);
-void rank_accu(DataList &D,const std::vector<double> pred);
+void rank_accu(RidList &D,const std::vector<double> pred);
#endif //RANKSVM_RANKACCU_H
diff --git a/model/ranksvm.h b/model/ranksvm.h
index 9051343..20bb35a 100644
--- a/model/ranksvm.h
+++ b/model/ranksvm.h
@@ -26,7 +26,7 @@ protected:
int fsize;
public:
virtual int train(RidList &D)=0;
- virtual int predict(DataList &D,std::vector<double> &res)=0;
+ virtual int predict(RidList &D,std::vector<double> &res)=0;
// TODO Not sure how to construct this
// Possible solution: generate a nxn matrix each row contains the sorted list of ranker result.
int saveModel(const std::string fname);
diff --git a/model/ranksvmtn.cpp b/model/ranksvmtn.cpp
index 1414c81..f904fdd 100644
--- a/model/ranksvmtn.cpp
+++ b/model/ranksvmtn.cpp
@@ -7,7 +7,7 @@ using namespace std;
using namespace Eigen;
// Main terminating criteria
-const int maxiter = 40; // max iteration count
+const int maxiter = 50; // max iteration count
const double prec=1e-10; // precision
// conjugate gradient
const double cg_prec=1e-10; // precision
@@ -17,14 +17,21 @@ const int ls_maxiter = 10;
const double line_prec=1e-10; // precision
const double line_turb=1e-15; // purturbation
+void cal_Dw(RidList &D,const VectorXd &w, VectorXd &Dw)
+{
+ int n = D.getSize();
+ #pragma omp parallel for
+ for (int i=0;i<n;++i)
+ Dw(i) = D.getVec(i).dot(w);
+}
+
int cal_Hs(RidList &D,const vector<int> &rank,const VectorXd &corr,const VectorXd &alpha,const VectorXd s,VectorXd &Hs)
{
int n = D.getSize();
int q = D.getqSize();
Hs = VectorXd::Zero(s.rows());
VectorXd Ds(n);
- for (int i=0;i<n;++i)
- Ds(i) = D.getVec(i).dot(s);
+ cal_Dw(D,s,Ds);
VectorXd gamma(n);
for (int i=0;i<n;)
{
@@ -153,8 +160,7 @@ int line_search(const VectorXd &w,RidList &D,const VectorXd &corr,const VectorXd
{
int n=D.getSize();
VectorXd Dd(n);
- for (int i=0;i<n;++i)
- Dd(i) = D.getVec(i).dot(step);
+ cal_Dw(D,step,Dd);
VectorXd alpha,beta,yt;
VectorXd grad;
VectorXd Hs;
@@ -167,8 +173,7 @@ int line_search(const VectorXd &w,RidList &D,const VectorXd &corr,const VectorXd
while (1)
{
grad=w+t*step;
- for (int i=0;i<n;++i)
- Dd(i) = D.getVec(i).dot(grad);
+ cal_Dw(D,grad,Dd);
cal_alpha_beta(Dd,corr,D,rank,yt,alpha,beta);
VectorXd tmp = alpha.cwiseProduct(yt)-beta;
VectorXd res = 0*grad;
@@ -209,8 +214,7 @@ int train_orig(int fsize, RidList &Data,const VectorXd &corr,VectorXd &weight){
VectorXd alpha,beta;
while (true)
{
- for (int i=0;i<n;++i)
- dw(i) = Data.getVec(i).dot(weight);
+ cal_Dw(Data,weight,dw);
cal_alpha_beta(dw,corr,Data,rank,yt,alpha,beta);
// Generate support vector matrix sv & gradient
obj = (weight.dot(weight) + C*(alpha.dot(yt.cwiseProduct(yt))-beta.dot(yt)))/2;
@@ -251,9 +255,9 @@ int RSVMTN::train(RidList &D){
return 0;
};
-int RSVMTN::predict(DataList &D, vector<double> &res){
+int RSVMTN::predict(RidList &D, vector<double> &res){
res.clear();
for (int i=0;i<D.getSize();++i)
- res.push_back(((D.getData()[i])->feature).dot(model.weight));
+ res.push_back(D.getVec(i).dot(model.weight));
return 0;
}; \ No newline at end of file
diff --git a/model/ranksvmtn.h b/model/ranksvmtn.h
index c98e581..97579b3 100644
--- a/model/ranksvmtn.h
+++ b/model/ranksvmtn.h
@@ -13,7 +13,7 @@ public:
return "TN";
};
virtual int train(RidList &D);
- virtual int predict(DataList &D,std::vector<double> &res);
+ virtual int predict(RidList &D,std::vector<double> &res);
};
#endif \ No newline at end of file