diff options
Diffstat (limited to 'model/ranksvmtn.cpp')
-rw-r--r-- | model/ranksvmtn.cpp | 36 |
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; |