diff options
author | Joe Zhao <ztuowen@gmail.com> | 2015-05-20 16:59:50 +0800 |
---|---|---|
committer | Joe Zhao <ztuowen@gmail.com> | 2015-05-20 16:59:50 +0800 |
commit | b15766bef024f086c51e56aa9af17783d3c1ff68 (patch) | |
tree | dea39e5833cd2a6f64b2eb5ded1e3159500cf96c /model | |
parent | 18ed589675b7887b1b49a47009784d1efe1057eb (diff) | |
download | ranksvm-b15766bef024f086c51e56aa9af17783d3c1ff68.tar.gz ranksvm-b15766bef024f086c51e56aa9af17783d3c1ff68.tar.bz2 ranksvm-b15766bef024f086c51e56aa9af17783d3c1ff68.zip |
speedup, internalize libop
Diffstat (limited to 'model')
-rw-r--r-- | model/ranksvm.cpp | 2 | ||||
-rw-r--r-- | model/ranksvmtn.cpp | 19 |
2 files changed, 13 insertions, 8 deletions
diff --git a/model/ranksvm.cpp b/model/ranksvm.cpp index a468729..acc2f4e 100644 --- a/model/ranksvm.cpp +++ b/model/ranksvm.cpp @@ -15,7 +15,7 @@ int maxiter = 1; // max iteration count double prec=1e-10; // precision // conjugate gradient double cg_prec=1e-3; // precision -int cg_maxiter = 500; +int cg_maxiter = 1000; int ls_maxiter = 20; // line search double line_prec=1e-10; // precision diff --git a/model/ranksvmtn.cpp b/model/ranksvmtn.cpp index 7f292f5..ba2d5a3 100644 --- a/model/ranksvmtn.cpp +++ b/model/ranksvmtn.cpp @@ -9,23 +9,26 @@ using namespace Eigen; void cal_Dw(RidList &D,const VectorXd &w, VectorXd &Dw) { int n = D.getSize(); - #pragma omp parallel for + // static chunk size of 1 to interleave the iterations + #pragma omp parallel for schedule(static,1) for (int i=0;i<n;++i) - Dw(i) = D.getVec(i).dot(w); + Dw(i) = D.getVecDot(i,w); } void cal_Dtw(RidList &D,const VectorXd &w, VectorXd &Dw) { int n = D.getSize(); - #pragma omp parallel + int fsize = D.getfSize(); + #pragma omp parallel shared(D,Dw) { VectorXd Dw_private = VectorXd::Zero(D.getfSize()); #pragma omp for nowait for (int i=0;i<n;++i) - Dw_private = Dw_private + D.getVec(i)*w(i); + D.addVecw(i,w(i),Dw_private); #pragma omp critical { - Dw=Dw+Dw_private; + for (int i=0;i<fsize;++i) + Dw(i) = Dw(i) + Dw_private(i); } } } @@ -55,8 +58,10 @@ int cal_Hs(RidList &D,const vector<int> &rank,const VectorXd &corr,const VectorX else g+=Ds[rank[i+j]]; } - VectorXd tmp = alpha.cwiseProduct(Ds)-gamma; - VectorXd res = VectorXd::Zero(D.getSize()); + VectorXd tmp(n); + for (int i=0;i<n;++i) + tmp(i) = alpha(i)*Ds(i)-gamma(i); + VectorXd res = VectorXd::Zero(D.getfSize()); cal_Dtw(D,tmp,res); Hs = s + C*res; return 0; |