52 libqp_state_T qp_exitflag={0, 0, 0, 0}, qp_exitflag_good={0, 0, 0, 0};
53 float64_t *b, *b2, *beta, *beta_good, *beta_start, *diag_H, *diag_H2;
54 float64_t R, *subgrad, *A, QPSolverTolRel, C=1.0;
55 float64_t *prevW, *wt, alpha, alpha_start, alpha_good=0.0, Fd_alpha0=0.0;
57 floatmax_t rsum, sq_norm_W, sq_norm_Wdiff, sq_norm_prevW, eps;
58 uint32_t *I, *I2, *I_start, *I_good, *ICPcounter, *ACPs, cntICP=0, cntACP=0;
62 uint32_t nCP_new=0, qp_cnt=0;
63 bmrm_ll *CPList_head, *CPList_tail, *cp_ptr, *cp_ptr2, *cp_list=NULL;
65 bool *map=NULL, tuneAlpha=
true, flag=
true, alphaChanged=
false, isThereGoodSolution=
false;
114 ICPcounter= (uint32_t*)
LIBBMRM_CALLOC(BufSize,
sizeof(uint32_t));
126 if (
H==NULL || A==NULL || b==NULL || beta==NULL || subgrad==NULL ||
127 diag_H==NULL || I==NULL || ICPcounter==NULL || ICPs==NULL ||
128 ACPs==NULL || cp_list==NULL || prevW==NULL || wt==NULL)
142 memset( (
bool*) map,
true, BufSize);
170 if (beta_start==NULL || beta_good==NULL || b2==NULL || diag_H2==NULL ||
171 I_start==NULL || I_good==NULL || I2==NULL ||
H2==NULL)
182 R = model->
risk(subgrad, W);
204 for (uint32_t j=0; j<nDim; ++j)
206 b[0]+=subgrad[j]*W[j];
207 sq_norm_W+=W[j]*W[j];
208 sq_norm_Wdiff+=(W[j]-prevW[j])*(W[j]-prevW[j]);
211 ppbmrm.
Fp=R+0.5*_lambda*sq_norm_W + alpha*sq_norm_Wdiff;
214 wdist=::sqrt(sq_norm_Wdiff);
216 K = (sq_norm_W == 0.0) ? 0.4 : 0.01*::sqrt(sq_norm_W);
230 SG_SPRINT(
"%4d: tim=%.3lf, Fp=%lf, Fd=%lf, R=%lf, K=%lf\n",
231 ppbmrm.
nIter, tstop-tstart, ppbmrm.
Fp, ppbmrm.
Fd, R, K);
247 for (uint32_t i=0; i<ppbmrm.
nCP; ++i)
253 for (uint32_t j=0; j<nDim; ++j)
261 for (uint32_t i=0; i<ppbmrm.
nCP; ++i)
271 for (uint32_t i=0; i<nDim; ++i)
280 beta[ppbmrm.
nCP]=0.0;
286 isThereGoodSolution=
false;
294 alpha_start=alpha; alpha=0.0;
295 beta[ppbmrm.
nCP]=0.0;
302 for (uint32_t i=0; i<ppbmrm.
nCP; ++i)
308 for (uint32_t j=0; j<nDim; ++j)
309 rsum+=A_1[j]*prevW[j];
311 b2[i]=b[i]-((2*alpha)/(_lambda+2*alpha))*rsum;
312 diag_H2[i]=diag_H[i]/(_lambda+2*alpha);
314 for (uint32_t j=0; j<ppbmrm.
nCP; ++j)
324 Fd_alpha0=-qp_exitflag.QP;
327 for (uint32_t i=0; i<nDim; ++i)
332 for (uint32_t j=0; j<ppbmrm.
nCP; ++j)
336 rsum+=A_1[i]*beta[j];
339 wt[i]=(2*alpha*prevW[i] - rsum)/(_lambda+2*alpha);
344 for (uint32_t i=0; i<nDim; ++i)
345 sq_norm_Wdiff+=(wt[i]-prevW[i])*(wt[i]-prevW[i]);
347 if (::sqrt(sq_norm_Wdiff) <= K)
351 if (alpha!=alpha_start)
364 beta[ppbmrm.
nCP]=0.0;
369 for (uint32_t i=0; i<ppbmrm.
nCP; ++i)
375 for (uint32_t j=0; j<nDim; ++j)
376 rsum+=A_1[j]*prevW[j];
378 b2[i]=b[i]-((2*alpha)/(_lambda+2*alpha))*rsum;
379 diag_H2[i]=diag_H[i]/(_lambda+2*alpha);
381 for (uint32_t j=0; j<ppbmrm.
nCP; ++j)
392 for (uint32_t i=0; i<nDim; ++i)
397 for (uint32_t j=0; j<ppbmrm.
nCP; ++j)
401 rsum+=A_1[i]*beta[j];
404 wt[i]=(2*alpha*prevW[i] - rsum)/(_lambda+2*alpha);
408 for (uint32_t i=0; i<nDim; ++i)
409 sq_norm_Wdiff+=(wt[i]-prevW[i])*(wt[i]-prevW[i]);
411 if (::sqrt(sq_norm_Wdiff) > K)
416 if (isThereGoodSolution)
421 qp_exitflag=qp_exitflag_good;
446 qp_exitflag_good=qp_exitflag;
447 isThereGoodSolution=
true;
476 for (uint32_t i=0; i<ppbmrm.
nCP; ++i)
482 for (uint32_t j=0; j<nDim; ++j)
483 rsum+=A_1[j]*prevW[j];
485 b2[i]=b[i]-((2*alpha)/(_lambda+2*alpha))*rsum;
486 diag_H2[i]=diag_H[i]/(_lambda+2*alpha);
488 for (uint32_t j=0; j<ppbmrm.
nCP; ++j)
504 for (uint32_t aaa=0; aaa<ppbmrm.
nCP; ++aaa)
518 for (uint32_t i=0; i<nDim; ++i)
523 for (uint32_t j=0; j<ppbmrm.
nCP; ++j)
527 rsum+=A_1[i]*beta[j];
530 W[i]=(2*alpha*prevW[i]-rsum)/(_lambda+2*alpha);
534 R = model->
risk(subgrad, W);
543 for (uint32_t j=0; j<nDim; ++j)
545 b[ppbmrm.
nCP]+=subgrad[j]*W[j];
546 sq_norm_W+=W[j]*W[j];
547 sq_norm_Wdiff+=(W[j]-prevW[j])*(W[j]-prevW[j]);
548 sq_norm_prevW+=prevW[j]*prevW[j];
552 ppbmrm.
Fp=R+0.5*_lambda*sq_norm_W + alpha*sq_norm_Wdiff;
553 ppbmrm.
Fd=-qp_exitflag.QP+((alpha*_lambda)/(_lambda + 2*alpha))*sq_norm_prevW;
558 eps=1.0-(ppbmrm.
Fd/ppbmrm.
Fp);
559 gamma=(lastFp*(1-eps)-Fd_alpha0)/(Tmax*(1-eps));
562 if ((lastFp-ppbmrm.
Fp) <= gamma)
577 if (ppbmrm.
Fp-ppbmrm.
Fd<=TolAbs)
581 if (ppbmrm.
nCP>=BufSize)
589 for (uint32_t i=0; i<nDim; ++i)
591 sq_norm_Wdiff+=(W[i]-prevW[i])*(W[i]-prevW[i]);
594 wdist=::sqrt(sq_norm_Wdiff);
603 SG_SPRINT(
"%4d: tim=%.3lf, Fp=%lf, Fd=%lf, (Fp-Fd)=%lf, (Fp-Fd)/Fp=%lf, R=%lf, nCP=%d, nzA=%d, wdist=%lf, alpha=%lf, qp_cnt=%d, gamma=%lf, tuneAlpha=%d\n",
604 ppbmrm.
nIter, tstop-tstart, ppbmrm.
Fp, ppbmrm.
Fd, ppbmrm.
Fp-ppbmrm.
Fd,
605 (ppbmrm.
Fp-ppbmrm.
Fd)/ppbmrm.
Fp, R, ppbmrm.
nCP, ppbmrm.
nzA, wdist, alpha,
606 qp_cnt, gamma, tuneAlpha);
609 if (ppbmrm.
nCP>=BufSize)
628 while (cp_ptr != CPList_tail)
630 if (ICPcounter[tmp_idx++]>=cleanAfter)
632 ICPs[cntICP++]=cp_ptr->
address;
636 ACPs[cntACP++]=tmp_idx-1;
645 nCP_new=ppbmrm.
nCP-cntICP;
647 for (uint32_t i=0; i<cntICP; ++i)
652 while(cp_ptr->
address != ICPs[i])
667 (ppbmrm.
nCP-tmp_idx)*
sizeof(uint32_t));
669 (ppbmrm.
nCP-tmp_idx)*
sizeof(uint32_t));
673 for (uint32_t i=0; i < nCP_new; ++i)
675 for (uint32_t j=0; j < nCP_new; ++j)
682 for (uint32_t i=0; i<nCP_new; ++i)
683 for (uint32_t j=0; j<nCP_new; ++j)