summaryrefslogtreecommitdiff
path: root/model/ranksvmtn.cpp
diff options
context:
space:
mode:
authorJoe Zhao <ztuowen@gmail.com>2015-05-20 16:59:50 +0800
committerJoe Zhao <ztuowen@gmail.com>2015-05-20 16:59:50 +0800
commitb15766bef024f086c51e56aa9af17783d3c1ff68 (patch)
treedea39e5833cd2a6f64b2eb5ded1e3159500cf96c /model/ranksvmtn.cpp
parent18ed589675b7887b1b49a47009784d1efe1057eb (diff)
downloadranksvm-b15766bef024f086c51e56aa9af17783d3c1ff68.tar.gz
ranksvm-b15766bef024f086c51e56aa9af17783d3c1ff68.tar.bz2
ranksvm-b15766bef024f086c51e56aa9af17783d3c1ff68.zip
speedup, internalize libop
Diffstat (limited to 'model/ranksvmtn.cpp')
-rw-r--r--model/ranksvmtn.cpp19
1 files changed, 12 insertions, 7 deletions
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;