summaryrefslogtreecommitdiff
path: root/model/ranksvmtn.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'model/ranksvmtn.cpp')
-rw-r--r--model/ranksvmtn.cpp36
1 files changed, 20 insertions, 16 deletions
diff --git a/model/ranksvmtn.cpp b/model/ranksvmtn.cpp
index 81b13ab..3436cce 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 = 60; // max iteration count
+const int maxiter = 40; // max iteration count
const double prec=1e-10; // precision
// conjugate gradient
const double cg_prec=1e-10; // precision
@@ -19,22 +19,24 @@ const double line_turb=1e-15; // purturbation
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(D.getSize());
- for (int i=0;i<D.getSize();++i)
+ VectorXd Ds(n);
+ for (int i=0;i<n;++i)
Ds(i) = D.getVec(i).dot(s);
- VectorXd gamma(D.getSize());
- for (int i=0;i<D.getSize();)
+ VectorXd gamma(n);
+ for (int i=0;i<n;)
{
double g=0;
- for (int j = D.getqSize()-1;j>=0;--j)
+ for (int j = q-1;j>=0;--j)
if (corr[rank[i+j]]>0)
gamma[rank[i+j]]=g;
else
g+=Ds[rank[i+j]];
g=0;
- i+=D.getqSize();
- for (int j = D.getqSize();j>0;--j)
+ i+=q;
+ for (int j = q;j>0;--j)
if (corr[rank[i-j]]<0)
gamma[rank[i-j]]=g;
else
@@ -42,7 +44,7 @@ int cal_Hs(RidList &D,const vector<int> &rank,const VectorXd &corr,const VectorX
}
VectorXd tmp = alpha.cwiseProduct(Ds)-gamma;
VectorXd res = 0*s;
- for (int i=0;i<D.getSize();++i)
+ for (int i=0;i<n;++i)
res = res + D.getVec(i)*tmp[i];
Hs = s + C*res;
return 0;
@@ -110,13 +112,14 @@ void ranksort(int l,int r,vector<int> &rank,VectorXd &ref)
int cal_alpha_beta(const VectorXd &dw,const VectorXd &corr,RidList &D,vector<int> &rank,VectorXd &yt,VectorXd &alpha,VectorXd &beta)
{
long n = dw.rows();
+ int q = D.getqSize();
yt = dw - corr;
alpha=VectorXd::Zero(n);
beta=VectorXd::Zero(n);
for (int i=0;i<n;++i) rank[i]=i;
- for (int i=0;i<D.getSize();i+=D.getqSize())
+ for (int i=0;i<n;i+=q)
{
- int ed=i+D.getqSize()-1;
+ int ed=i+q-1;
ranksort(i,ed,rank,yt);
double a=0,b=0;
for (int j=i;j<=ed;++j)
@@ -148,14 +151,15 @@ int cal_alpha_beta(const VectorXd &dw,const VectorXd &corr,RidList &D,vector<int
// line search using newton method
int line_search(const VectorXd &w,RidList &D,const VectorXd &corr,const VectorXd &step,double &t)
{
- VectorXd Dd(D.getSize());
- for (int i=0;i<D.getSize();++i)
+ int n=D.getSize();
+ VectorXd Dd(n);
+ for (int i=0;i<n;++i)
Dd(i) = D.getVec(i).dot(step);
VectorXd alpha,beta,yt;
VectorXd grad;
VectorXd Hs;
- int n=D.getSize();
- vector<int> rank(D.getSize());
+
+ vector<int> rank(n);
int iter = 0;
double g,h;
@@ -163,7 +167,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<D.getSize();++i)
+ for (int i=0;i<n;++i)
Dd(i) = D.getVec(i).dot(grad);
cal_alpha_beta(Dd,corr,D,rank,yt,alpha,beta);
VectorXd tmp = alpha.cwiseProduct(yt)-beta;