summaryrefslogtreecommitdiff
path: root/model
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
parent18ed589675b7887b1b49a47009784d1efe1057eb (diff)
downloadranksvm-b15766bef024f086c51e56aa9af17783d3c1ff68.tar.gz
ranksvm-b15766bef024f086c51e56aa9af17783d3c1ff68.tar.bz2
ranksvm-b15766bef024f086c51e56aa9af17783d3c1ff68.zip
speedup, internalize libop
Diffstat (limited to 'model')
-rw-r--r--model/ranksvm.cpp2
-rw-r--r--model/ranksvmtn.cpp19
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;