49 using namespace shogun;
51 #ifndef DOXYGEN_SHOULD_SKIP_THIS
52 struct S_THREAD_PARAM_REACTIVATE_LINADD
68 int32_t * active2dnum ;
73 struct S_THREAD_PARAM_REACTIVATE_VANILLA
80 int32_t* changed2dnum;
81 int32_t* inactive2dnum;
87 struct S_THREAD_PARAM_KERNEL
95 #endif // DOXYGEN_SHOULD_SKIP_THIS
99 S_THREAD_PARAM* params = (S_THREAD_PARAM*) p;
103 for (jj=params->start;(jj<params->end) && (j=params->active2dnum[jj])>=0;jj++)
104 params->lin[j]+=params->kernel->compute_optimized(params->docs[j]);
111 S_THREAD_PARAM_KERNEL* params = (S_THREAD_PARAM_KERNEL*) p;
114 for (jj=params->start;jj<params->end;jj++)
115 params->Kval[jj]=params->svmlight->compute_kernel(params->KI[jj], params->KJ[jj]) ;
206 SG_ERROR(
"SVM_light can not proceed without kernel!\n");
212 SG_ERROR(
"%s::train_machine(): Number of training vectors (%d) does"
213 " not match number of labels (%d)\n",
get_name(),
220 SG_ERROR(
"SVM_light can not proceed without initialized kernel!\n");
246 SG_DEBUG(
"use_kernel_cache = %i\n", use_kernel_cache) ;
269 for (int32_t i=0; i<
model->sv_num-1; i++)
282 if (use_kernel_cache)
298 int32_t *inconsistent, i;
299 int32_t misclassified,upsupvecnum;
302 int32_t trainpos=0, trainneg=0 ;
305 int32_t totdoc=lab.
vlen;
309 int32_t* docs=
SG_MALLOC(int32_t, totdoc);
321 for (i=0; i<totdoc; i++)
326 TIMING timing_profile;
327 SHRINK_STATE shrink_state;
329 timing_profile.time_kernel=0;
330 timing_profile.time_opti=0;
331 timing_profile.time_shrink=0;
332 timing_profile.time_update=0;
333 timing_profile.time_model=0;
334 timing_profile.time_check=0;
335 timing_profile.time_select=0;
345 inconsistent =
SG_MALLOC(int32_t, totdoc);
368 model->at_upper_bound=0;
372 model->totdoc=totdoc;
378 model->loo_recall=-1;
379 model->loo_precision=-1;
382 model->xa_precision=-1;
384 for (i=0;i<totdoc;i++) {
396 else if(label[i] < 0) {
411 SG_INFO(
"Computing starting state...");
416 for (i=0; i<totdoc; i++)
422 int32_t* index =
SG_MALLOC(int32_t, totdoc);
423 int32_t* index2dnum =
SG_MALLOC(int32_t, totdoc+11);
425 for (i=0;i<totdoc;i++) {
427 alpha[i]=fabs(alpha[i]);
428 if(alpha[i]<0) alpha[i]=0;
443 for (i=0;i<totdoc;i++)
444 if((alpha[i]>0) && (alpha[i]<
learn_parm->svm_cost[i])
448 for (i=0;i<totdoc;i++)
459 for (i=0;i<totdoc;i++)
460 if((alpha[i]>0) && (alpha[i]<
learn_parm->svm_cost[i])
464 for (i=0;i<totdoc;i++)
474 index2dnum,index2dnum);
475 for (i=0;i<totdoc;i++) {
487 SG_DEBUG(
"%d totdoc %d pos %d neg\n", totdoc, trainpos, trainneg);
492 &shrink_state,inconsistent,a,lin,
494 &maxdiff,(int32_t)-1,
502 SG_DEBUG(
"(%ld iterations)", iterations);
506 for (i=0;(i<totdoc);i++) {
511 SG_INFO(
"Optimization finished (%ld misclassified, maxdiff=%.8f).\n",
512 misclassified,maxdiff);
516 SG_WARNING(
"maximum violation (%f) exceeds svm_epsilon (%f) due to numerical difficulties\n", maxdiff,
epsilon);
519 for (i=1;i<
model->sv_num;i++)
521 if(fabs(
model->alpha[i]) >=
526 SG_INFO(
"Number of SV: %ld (including %ld at upper bound)\n",
527 model->sv_num-1,upsupvecnum);
544 SHRINK_STATE *shrink_state,
545 int32_t *inconsistent,
547 TIMING *timing_profile,
float64_t *maxdiff,
548 int32_t heldout, int32_t retrain)
567 int32_t *chosen,*key,i,j,jj,*last_suboptimal_at,noshrink;
568 int32_t inconsistentnum,choosenum,already_chosen=0,iteration;
569 int32_t misclassified,supvecnum=0,*active2dnum,inactivenum;
570 int32_t *working2dnum,*selexam;
574 int32_t t0=0,t1=0,t2=0,t3=0,t4=0,t5=0,t6=0;
578 int32_t bestmaxdiffiter,terminate;
579 bool reactivated=
false;
595 last_suboptimal_at =
SG_MALLOC(int32_t, totdoc);
601 working2dnum =
SG_MALLOC(int32_t, totdoc+11);
602 active2dnum =
SG_MALLOC(int32_t, totdoc+11);
613 if(!retrain) retrain=1;
616 bestmaxdiff=999999999;
623 for (i=0;i<totdoc;i++) {
626 last_suboptimal_at[i]=1;
630 activenum=
compute_index(shrink_state->active,totdoc,active2dnum);
631 inactivenum=totdoc-activenum;
651 SG_DEBUG(
"\nSelecting working set... ");
658 for (jj=0;(j=working2dnum[jj])>=0;jj++) {
676 for (jj=0;(j=working2dnum[jj])>=0;jj++) {
680 for (i=0;i<totdoc;i++) {
681 if((inconsistent[i] || (heldout==i)) && (a[i] != 0.0)) {
689 for (i=0;i<totdoc;i++) {
692 for (i=0;(i<totdoc) && (fabs(eq) >
learn_parm->epsilon_a);i++) {
693 if((eq*label[i] > 0) && (a[i] > 0)) {
696 if((eq*label[i]) > a[i]) {
719 label,a,lin,c,totdoc,
722 inconsistent,active2dnum,
723 working2dnum,selcrit,selexam,1,
725 choosenum+=already_chosen;
728 label,a,lin,c,totdoc,
731 inconsistent,active2dnum,
732 working2dnum,selcrit,selexam,0,key,
739 label,a,lin,c,totdoc,
742 inconsistent,active2dnum,
743 working2dnum,selcrit,selexam,key,
749 SG_INFO(
" %ld vectors chosen\n",choosenum);
779 optimize_svm(docs,label,inconsistent,0.0,chosen,active2dnum,
780 totdoc,working2dnum,choosenum,a,lin,c,
781 aicache,&qp,&epsilon_crit_org);
793 for (jj=0;(i=working2dnum[jj])>=0;jj++) {
798 maxdiff,epsilon_crit_org,&misclassified,
799 inconsistent,active2dnum,last_suboptimal_at,
804 timing_profile->time_select+=t1-t0;
805 timing_profile->time_kernel+=t2-t1;
806 timing_profile->time_opti+=t3-t2;
807 timing_profile->time_update+=t4-t3;
808 timing_profile->time_model+=t5-t4;
809 timing_profile->time_check+=t6-t5;
813 if((*maxdiff) < bestmaxdiff) {
814 bestmaxdiff=(*maxdiff);
815 bestmaxdiffiter=iteration;
817 if(iteration > (bestmaxdiffiter+
learn_parm->maxiter)) {
821 SG_WARNING(
"Relaxing KT-Conditions due to slow progress! Terminating!\n");
822 SG_DEBUG(
"(iteration :%d, bestmaxdiffiter: %d, lean_param->maxiter: %d)\n", iteration, bestmaxdiffiter,
learn_parm->maxiter );
827 if ((!
callback) && (!retrain) && (inactivenum>0) &&
831 SG_DEBUG(
"reactivating inactive examples\n");
834 iteration,inconsistent,
838 SG_DEBUG(
"done reactivating inactive examples (maxdiff:%8f eps_crit:%8f orig_eps:%8f)\n", *maxdiff,
learn_parm->epsilon_crit, epsilon_crit_org);
840 activenum=
compute_index(shrink_state->active,totdoc,active2dnum);
841 inactivenum=totdoc-activenum;
843 bestmaxdiff=(*maxdiff);
844 bestmaxdiffiter=iteration;
851 SG_INFO(
"restarting optimization as we are - due to shrinking - deviating too much (maxdiff(%f) > eps(%f))\n", *maxdiff,
learn_parm->epsilon_crit);
858 SG_DEBUG(
"Number of inactive variables = %ld\n", inactivenum);
862 if((!retrain) && (
learn_parm->epsilon_crit>(*maxdiff)))
864 if((!retrain) && (
learn_parm->epsilon_crit>epsilon_crit_org)) {
873 SG_INFO(
" => (%ld SV (incl. %ld SV at u-bound), max violation=%.5f)\n",
874 supvecnum,
model->at_upper_bound,(*maxdiff));
880 if (((iteration % 10) == 0) && (!noshrink) && !
callback)
882 activenum=
shrink_problem(shrink_state,active2dnum,last_suboptimal_at,iteration,totdoc,
884 CMath::max((int32_t)(totdoc/500),(int32_t) 100)),
885 a,inconsistent, c, lin, label);
887 inactivenum=totdoc-activenum;
894 shrink_state->active);
898 if (bestmaxdiff>worstmaxdiff)
899 worstmaxdiff=bestmaxdiff;
911 SG_DEBUG(
"inactive:%d\n", inactivenum);
913 if (inactivenum && !reactivated && !
callback)
915 SG_DEBUG(
"reactivating inactive examples\n");
917 iteration,inconsistent,
920 SG_DEBUG(
"done reactivating inactive examples\n");
922 activenum=
compute_index(shrink_state->active,totdoc,active2dnum);
923 inactivenum=totdoc-activenum;
925 bestmaxdiff=(*maxdiff);
926 bestmaxdiffiter=iteration;
964 for (int32_t i=0;i<totdoc;i++)
965 criterion=criterion+(eps[i]-(
float64_t)label[i]*c[i])*a[i]+0.5*a[i]*label[i]*lin[i];
981 for (i=0;index[i] != -1;i++);
987 int32_t *binfeature, int32_t range, int32_t *index)
990 register int32_t i,ii;
993 for (i=0;i<range;i++) {
1007 int32_t* docs, int32_t* label, int32_t *exclude_from_eq_const,
1008 float64_t eq_target, int32_t *chosen, int32_t *active2dnum, int32_t totdoc,
1022 exclude_from_eq_const,eq_target,chosen,
1023 active2dnum,working2dnum,a,lin,c,
1024 varnum,totdoc,aicache,qp);
1039 for (i=0;i<varnum;i++)
1040 a[working2dnum[i]]=a_v[i];
1044 int32_t* docs, int32_t* label, int32_t *exclude_from_eq_const,
1045 float64_t eq_target, int32_t *chosen, int32_t *active2dnum, int32_t *key,
1052 chosen, active2dnum, key, a, lin, c,
1053 varnum, totdoc, aicache, qp) ;
1058 register int32_t ki,kj,i,j;
1062 qp->opt_ce0[0]=-eq_target;
1063 for (j=1;j<
model->sv_num;j++) {
1064 if((!chosen[
model->supvec[j]])
1065 && (!exclude_from_eq_const[(
model->supvec[j])])) {
1066 qp->opt_ce0[0]+=
model->alpha[j];
1075 for (i=0;i<varnum;i++) {
1076 qp->opt_g0[i]=lin[key[i]];
1080 int32_t *KI=
SG_MALLOC(int32_t, varnum*varnum);
1081 int32_t *KJ=
SG_MALLOC(int32_t, varnum*varnum);
1084 for (i=0;i<varnum;i++) {
1089 for (j=i+1;j<varnum;j++)
1097 ASSERT(Knum<=varnum*(varnum+1)/2);
1105 params[t].svmlight =
this;
1106 params[t].start = t*step;
1107 params[t].end = (t+1)*step;
1110 params[t].Kval=Kval ;
1117 pthread_join(threads[t], NULL);
1123 for (i=0;i<varnum;i++) {
1127 qp->opt_ce[i]=label[ki];
1131 kernel_temp=Kval[Knum] ;
1134 qp->opt_g0[i]-=(kernel_temp*a[ki]*(
float64_t)label[ki]);
1136 qp->opt_g[varnum*i+i]=kernel_temp;
1138 for (j=i+1;j<varnum;j++) {
1140 kernel_temp=Kval[Knum] ;
1143 qp->opt_g0[i]-=(kernel_temp*a[kj]*(
float64_t)label[kj]);
1144 qp->opt_g0[j]-=(kernel_temp*a[ki]*(
float64_t)label[ki]);
1147 qp->opt_g[varnum*j+i]=qp->opt_g[varnum*i+j];
1161 for (i=0;i<varnum;i++) {
1163 qp->opt_xinit[i]=a[key[i]];
1176 int32_t* docs, int32_t* label, int32_t *exclude_from_eq_const,
1177 float64_t eq_target, int32_t *chosen, int32_t *active2dnum, int32_t *key,
1181 register int32_t ki,kj,i,j;
1185 qp->opt_ce0[0]=-eq_target;
1186 for (j=1;j<
model->sv_num;j++) {
1187 if((!chosen[
model->supvec[j]])
1188 && (!exclude_from_eq_const[(
model->supvec[j])])) {
1189 qp->opt_ce0[0]+=
model->alpha[j];
1198 for (i=0;i<varnum;i++) {
1199 qp->opt_g0[i]=lin[key[i]];
1202 for (i=0;i<varnum;i++) {
1206 qp->opt_ce[i]=label[ki];
1212 qp->opt_g0[i]-=(kernel_temp*a[ki]*(
float64_t)label[ki]);
1214 qp->opt_g[varnum*i+i]=kernel_temp;
1216 for (j=i+1;j<varnum;j++) {
1221 qp->opt_g0[i]-=(kernel_temp*a[kj]*(
float64_t)label[kj]);
1222 qp->opt_g0[j]-=(kernel_temp*a[ki]*(
float64_t)label[ki]);
1225 qp->opt_g[varnum*j+i]=qp->opt_g[varnum*i+j];
1235 for (i=0;i<varnum;i++) {
1237 qp->opt_xinit[i]=a[key[i]];
1254 int32_t i,ii,pos,b_calculated=0,first_low,first_high;
1266 for (ii=0;(i=working2dnum[ii])>=0;ii++) {
1267 if((a_old[i]>0) && (a[i]==0)) {
1268 pos=
model->index[i];
1275 else if((a_old[i]==0) && (a[i]>0)) {
1281 else if(a_old[i]==a[i]) {
1288 if((a_old[i]>=ex_c) && (a[i]<ex_c)) {
1289 (
model->at_upper_bound)--;
1291 else if((a_old[i]<ex_c) && (a[i]>=ex_c)) {
1292 (
model->at_upper_bound)++;
1296 && (a[i]>
learn_parm->epsilon_a) && (a[i]<ex_c)) {
1307 && (
model->sv_num-1 ==
model->at_upper_bound)) {
1312 for (ii=0;(i=active2dnum[ii])>=0;ii++) {
1317 if((b_temp>b_low) || (first_low)) {
1324 if((b_temp<b_high) || (first_high)) {
1333 if((b_temp>b_low) || (first_low)) {
1340 if((b_temp<b_high) || (first_high)) {
1350 else if(first_low) {
1354 model->b=-(b_high+b_low)/2.0;
1362 return(
model->sv_num-1);
1368 int32_t *inconsistent, int32_t *active2dnum, int32_t *last_suboptimal_at,
1372 int32_t i,ii,retrain;
1382 for (ii=0;(i=active2dnum[ii])>=0;ii++) {
1383 if((!inconsistent[i]) && label[i]) {
1391 if((a[i]>
learn_parm->epsilon_a) && (dist > target)) {
1392 if((dist-target)>(*maxdiff))
1393 (*maxdiff)=dist-target;
1395 else if((a[i]<ex_c) && (dist < target)) {
1396 if((target-dist)>(*maxdiff))
1397 (*maxdiff)=target-dist;
1406 last_suboptimal_at[i]=iteration;
1409 && (dist < (target+
learn_parm->epsilon_shrink))) {
1410 last_suboptimal_at[i]=iteration;
1412 else if((a[i]>=ex_c)
1413 && (dist > (target-
learn_parm->epsilon_shrink))) {
1414 last_suboptimal_at[i]=iteration;
1420 if((!retrain) && ((*maxdiff) >
learn_parm->epsilon_crit)) {
1427 int32_t* docs, int32_t* label, int32_t *active2dnum,
float64_t *a,
1435 register int32_t i=0,ii=0,j=0,jj=0;
1442 a_old, working2dnum, totdoc, lin, aicache);
1448 int32_t num_working=0;
1449 for (ii=0;(i=working2dnum[ii])>=0;ii++) {
1450 if(a[i] != a_old[i]) {
1460 for (jj=0;(j=active2dnum[jj])>=0;jj++) {
1467 int32_t num_elem = 0 ;
1468 for (jj=0;(j=active2dnum[jj])>=0;jj++) num_elem++ ;
1474 int32_t end = step ;
1478 params[t].kernel =
kernel ;
1479 params[t].lin = lin ;
1480 params[t].docs = docs ;
1481 params[t].active2dnum=active2dnum ;
1482 params[t].start = start ;
1483 params[t].end = end ;
1494 pthread_join(threads[t], &ret) ;
1508 a, a_old, working2dnum, totdoc, lin, aicache);
1511 for (jj=0;(i=working2dnum[jj])>=0;jj++) {
1512 if(a[i] != a_old[i]) {
1514 for (ii=0;(j=active2dnum[ii])>=0;ii++)
1515 lin[j]+=(a[i]-a_old[i])*aicache[j]*(
float64_t)label[i];
1524 int32_t* docs, int32_t* label, int32_t *active2dnum,
float64_t *a,
1530 int32_t num_weights = -1;
1533 ASSERT(num_weights==num_kernels);
1540 int32_t n = 0, i, j ;
1546 if(a[i] != a_old[i])
1550 W[j*num_kernels+n]+=(a[i]-a_old[i])*aicache[j]*(
float64_t)label[i];
1565 for (int32_t i=0; i<num_kernels; i++)
1567 w_backup[i] = old_beta[i] ;
1570 for (int32_t n=0; n<num_kernels; n++)
1575 for (int32_t i=0;i<num;i++)
1577 if(a[i] != a_old[i])
1579 for (int32_t j=0;j<num;j++)
1598 int32_t* docs, int32_t* label, int32_t *active2dnum,
float64_t *a,
1607 int32_t num_weights = -1;
1610 ASSERT(num_weights==num_kernels);
1616 for (int32_t i=0; i<num_kernels; i++)
1618 w_backup[i] = old_beta[i] ;
1626 for (int32_t ii=0, i=0;(i=working2dnum[ii])>=0;ii++) {
1627 if(a[i] != a_old[i]) {
1635 for (int32_t i=0; i<num; i++)
1647 params[t].kernel =
kernel;
1649 params[t].start = t*step;
1650 params[t].end = (t+1)*step;
1658 pthread_join(threads[t], NULL);
1673 S_THREAD_PARAM* params = (S_THREAD_PARAM*) p;
1675 int32_t num_kernels=params->kernel->get_num_subkernels();
1678 for (int32_t i=params->start; i<params->end; i++)
1679 params->kernel->compute_by_subkernel(i,&(params->W[i*num_kernels]));
1692 int nk = (int) num_kernels;
1693 double* alphay =
SG_MALLOC(
double, num);
1695 for (int32_t i=0; i<num; i++)
1697 alphay[i]=a[i]*label[i];
1701 for (int32_t i=0; i<num_kernels; i++)
1704 cblas_dgemv(CblasColMajor, CblasNoTrans, num_kernels, (
int) num, 0.5, (
double*)
W,
1705 num_kernels, alphay, 1, 1.0, (
double*) sumw, 1);
1709 for (int32_t i=0; i<num; i++)
1712 for (int32_t d=0; d<num_kernels; d++)
1715 for (int32_t i=0; i<num; i++)
1716 sumw[d] += a[i]*(0.5*label[i]*
W[i*num_kernels+d]);
1728 cblas_dgemv(CblasColMajor, CblasTrans, nk, (
int) num, 1.0, (
double*)
W,
1729 nk, (
double*) new_beta, 1, 0.0, (
double*) lin, 1);
1731 for (int32_t i=0; i<num; i++)
1733 for (int32_t d=0; d<num_kernels; d++)
1735 for (int32_t i=0; i<num; i++)
1736 lin[i] += new_beta[d]*
W[i*num_kernels+d] ;
1747 int32_t qp_size, int32_t *inconsistent, int32_t *active2dnum,
1748 int32_t *working2dnum,
float64_t *selcrit, int32_t *select,
1749 int32_t cache_only, int32_t *key, int32_t *chosen)
1755 int32_t choosenum,i,j,k,activedoc,inum,valid;
1758 for (inum=0;working2dnum[inum]>=0;inum++);
1761 for (i=0;(j=active2dnum[i])>=0;i++) {
1773 && (!((a[j]<=(0+
learn_parm->epsilon_a)) && (s<0)))
1778 && (!inconsistent[j]))
1785 select_top_n(selcrit,activedoc,select,(int32_t)(qp_size/2));
1786 for (k=0;(choosenum<(qp_size/2)) && (k<(qp_size/2)) && (k<activedoc);k++) {
1789 working2dnum[inum+choosenum]=i;
1798 for (i=0;(j=active2dnum[i])>=0;i++) {
1810 && (!((a[j]<=(0+
learn_parm->epsilon_a)) && (s<0)))
1815 && (!inconsistent[j]))
1823 select_top_n(selcrit,activedoc,select,(int32_t)(qp_size/2));
1824 for (k=0;(choosenum<qp_size) && (k<(qp_size/2)) && (k<activedoc);k++) {
1827 working2dnum[inum+choosenum]=i;
1833 working2dnum[inum+choosenum]=-1;
1839 int32_t qp_size, int32_t *inconsistent, int32_t *active2dnum,
1840 int32_t *working2dnum,
float64_t *selcrit, int32_t *select, int32_t *key,
1841 int32_t *chosen, int32_t iteration)
1847 int32_t choosenum,i,j,k,activedoc,inum;
1850 for (inum=0;working2dnum[inum]>=0;inum++);
1853 for (i=0;(j=active2dnum[i])>=0;i++) {
1855 if((!((a[j]<=(0+
learn_parm->epsilon_a)) && (s<0)))
1858 && (!inconsistent[j])
1861 selcrit[activedoc]=(j+iteration) % totdoc;
1866 select_top_n(selcrit,activedoc,select,(int32_t)(qp_size/2));
1867 for (k=0;(choosenum<(qp_size/2)) && (k<(qp_size/2)) && (k<activedoc);k++) {
1870 working2dnum[inum+choosenum]=i;
1878 for (i=0;(j=active2dnum[i])>=0;i++) {
1880 if((!((a[j]<=(0+
learn_parm->epsilon_a)) && (s<0)))
1883 && (!inconsistent[j])
1886 selcrit[activedoc]=(j+iteration) % totdoc;
1891 select_top_n(selcrit,activedoc,select,(int32_t)(qp_size/2));
1892 for (k=0;(choosenum<qp_size) && (k<(qp_size/2)) && (k<activedoc);k++) {
1895 working2dnum[inum+choosenum]=i;
1901 working2dnum[inum+choosenum]=-1;
1908 float64_t *selcrit, int32_t range, int32_t* select, int32_t n)
1910 register int32_t i,j;
1912 for (i=0;(i<n) && (i<range);i++) {
1913 for (j=i;j>=0;j--) {
1914 if((j>0) && (selcrit[select[j-1]]<selcrit[i])){
1915 select[j]=select[j-1];
1924 for (i=n;i<range;i++) {
1925 if(selcrit[i]>selcrit[select[n-1]]) {
1926 for (j=n-1;j>=0;j--) {
1927 if((j>0) && (selcrit[select[j-1]]<selcrit[i])) {
1928 select[j]=select[j-1];
1944 SHRINK_STATE *shrink_state, int32_t totdoc, int32_t maxhistory)
1948 shrink_state->deactnum=0;
1949 shrink_state->active =
SG_MALLOC(int32_t, totdoc);
1950 shrink_state->inactive_since =
SG_MALLOC(int32_t, totdoc);
1952 shrink_state->maxhistory=maxhistory;
1956 for (i=0;i<totdoc;i++) {
1957 shrink_state->active[i]=1;
1958 shrink_state->inactive_since[i]=0;
1959 shrink_state->last_a[i]=0;
1960 shrink_state->last_lin[i]=0;
1966 SG_FREE(shrink_state->active);
1967 SG_FREE(shrink_state->inactive_since);
1968 if(shrink_state->deactnum > 0)
1969 SG_FREE((shrink_state->a_history[shrink_state->deactnum-1]));
1970 SG_FREE((shrink_state->a_history));
1971 SG_FREE((shrink_state->last_a));
1972 SG_FREE((shrink_state->last_lin));
1976 SHRINK_STATE *shrink_state, int32_t *active2dnum,
1977 int32_t *last_suboptimal_at, int32_t iteration, int32_t totdoc,
1983 int32_t i,ii,change,activenum,lastiter;
1988 for (ii=0;active2dnum[ii]>=0;ii++) {
1991 lastiter=last_suboptimal_at[i];
1993 if(((iteration-lastiter) >
learn_parm->svm_iter_to_shrink)
1994 || (inconsistent[i])) {
1998 if((change>=minshrink)
1999 && (shrink_state->deactnum<shrink_state->maxhistory)) {
2009 shrink_state->a_history[shrink_state->deactnum]=a_old;
2010 for (i=0;i<totdoc;i++) {
2014 for (ii=0;active2dnum[ii]>=0;ii++) {
2016 lastiter=last_suboptimal_at[i];
2017 if(((iteration-lastiter) >
learn_parm->svm_iter_to_shrink)
2018 || (inconsistent[i])) {
2019 shrink_state->active[i]=0;
2020 shrink_state->inactive_since[i]=shrink_state->deactnum;
2023 activenum=
compute_index(shrink_state->active,totdoc,active2dnum);
2024 shrink_state->deactnum++;
2026 shrink_state->deactnum=0;
2030 SG_DEBUG(
"Number of inactive variables = %ld\n", totdoc-activenum);
2038 S_THREAD_PARAM_REACTIVATE_LINADD* params = (S_THREAD_PARAM_REACTIVATE_LINADD*) p;
2043 int32_t* active = params->active;
2044 int32_t* docs = params->docs;
2045 int32_t start = params->start;
2046 int32_t end = params->end;
2048 for (int32_t i=start;i<end;i++)
2061 S_THREAD_PARAM_REACTIVATE_VANILLA* params = (S_THREAD_PARAM_REACTIVATE_VANILLA*) p;
2068 ASSERT(params->changed2dnum);
2069 ASSERT(params->inactive2dnum);
2077 int32_t* changed2dnum = params->changed2dnum;
2078 int32_t* inactive2dnum = params->inactive2dnum;
2079 int32_t* label = params->label;
2080 int32_t start = params->start;
2081 int32_t end = params->end;
2083 for (int32_t ii=start;ii<end;ii++)
2085 int32_t i=changed2dnum[ii];
2090 for (int32_t jj=0;(j=inactive2dnum[jj])>=0;jj++)
2091 lin[j]+=(a[i]-a_old[i])*aicache[j]*(
float64_t)label[i];
2098 float64_t *c, int32_t totdoc, int32_t iteration, int32_t *inconsistent,
2104 register int32_t i,j,ii,jj,t,*changed2dnum,*inactive2dnum;
2105 int32_t *changed,*inactive;
2110 a_old=shrink_state->last_a;
2114 SG_DEBUG(
" clear normal - linadd\n");
2117 int32_t num_modified=0;
2118 for (i=0;i<totdoc;i++) {
2119 if(a[i] != a_old[i]) {
2130 if (num_threads < 2)
2132 S_THREAD_PARAM_REACTIVATE_LINADD params;
2135 params.last_lin=shrink_state->last_lin;
2137 params.active=shrink_state->active;
2145 pthread_t* threads =
SG_MALLOC(pthread_t, num_threads-1);
2146 S_THREAD_PARAM_REACTIVATE_LINADD* params =
SG_MALLOC(S_THREAD_PARAM_REACTIVATE_LINADD, num_threads);
2147 int32_t step= totdoc/num_threads;
2149 for (t=0; t<num_threads-1; t++)
2153 params[t].last_lin=shrink_state->last_lin;
2154 params[t].docs=docs;
2155 params[t].active=shrink_state->active;
2156 params[t].start = t*step;
2157 params[t].end = (t+1)*step;
2163 params[t].last_lin=shrink_state->last_lin;
2164 params[t].docs=docs;
2165 params[t].active=shrink_state->active;
2166 params[t].start = t*step;
2167 params[t].end = totdoc;
2170 for (t=0; t<num_threads-1; t++)
2171 pthread_join(threads[t], NULL);
2183 int32_t *idx =
SG_MALLOC(int32_t, totdoc);
2184 int32_t num_suppvec=0 ;
2186 for (i=0; i<totdoc; i++)
2188 if(a[i] != a_old[i])
2190 alphas[num_suppvec] = (a[i]-a_old[i])*(
float64_t)label[i];
2191 idx[num_suppvec] = i ;
2199 int32_t num_inactive=0;
2200 int32_t* inactive_idx=
SG_MALLOC(int32_t, totdoc);
2203 for (i=0;i<totdoc;i++)
2205 if(!shrink_state->active[i])
2207 inactive_idx[j++] = i;
2215 memset(dest, 0,
sizeof(
float64_t)*num_inactive);
2220 for (i=0;i<totdoc;i++) {
2221 if(!shrink_state->active[i]) {
2222 lin[i] = shrink_state->last_lin[i] + dest[j++] ;
2224 shrink_state->last_lin[i]=lin[i];
2231 for (i=0;i<totdoc;i++)
2232 shrink_state->last_lin[i]=lin[i];
2245 changed2dnum=
SG_MALLOC(int32_t, totdoc+11);
2247 inactive2dnum=
SG_MALLOC(int32_t, totdoc+11);
2248 for (t=shrink_state->deactnum-1;(t>=0) && shrink_state->a_history[t];t--)
2253 a_old=shrink_state->a_history[t];
2254 for (i=0;i<totdoc;i++) {
2255 inactive[i]=((!shrink_state->active[i])
2256 && (shrink_state->inactive_since[i] == t));
2257 changed[i]= (a[i] != a_old[i]);
2264 int32_t num_threads=1;
2267 if (num_threads < 2)
2269 for (ii=0;(i=changed2dnum[ii])>=0;ii++) {
2271 for (jj=0;(j=inactive2dnum[jj])>=0;jj++)
2272 lin[j]+=(a[i]-a_old[i])*aicache[j]*(
float64_t)label[i];
2279 int32_t num_changed=0;
2280 for (ii=0;changed2dnum[ii]>=0;ii++)
2285 pthread_t* threads=
SG_MALLOC(pthread_t, num_threads-1);
2286 S_THREAD_PARAM_REACTIVATE_VANILLA* params =
SG_MALLOC(S_THREAD_PARAM_REACTIVATE_VANILLA, num_threads);
2287 int32_t step= num_changed/num_threads;
2291 memset(tmp_lin, 0,
sizeof(
float64_t)*((
size_t) totdoc)*num_threads);
2293 memset(tmp_aicache, 0,
sizeof(
float64_t)*((
size_t) totdoc)*num_threads);
2296 for (thr=0; thr<num_threads-1; thr++)
2298 params[thr].kernel=
kernel;
2299 params[thr].lin=&tmp_lin[thr*totdoc];
2300 params[thr].aicache=&tmp_aicache[thr*totdoc];
2302 params[thr].a_old=a_old;
2303 params[thr].changed2dnum=changed2dnum;
2304 params[thr].inactive2dnum=inactive2dnum;
2305 params[thr].label=label;
2306 params[thr].start = thr*step;
2307 params[thr].end = (thr+1)*step;
2311 params[thr].kernel=
kernel;
2312 params[thr].lin=&tmp_lin[thr*totdoc];
2313 params[thr].aicache=&tmp_aicache[thr*totdoc];
2315 params[thr].a_old=a_old;
2316 params[thr].changed2dnum=changed2dnum;
2317 params[thr].inactive2dnum=inactive2dnum;
2318 params[thr].label=label;
2319 params[thr].start = thr*step;
2320 params[thr].end = num_changed;
2323 for (jj=0;(j=inactive2dnum[jj])>=0;jj++)
2324 lin[j]+=tmp_lin[totdoc*thr+j];
2326 for (thr=0; thr<num_threads-1; thr++)
2328 pthread_join(threads[thr], NULL);
2331 for (jj=0;(j=inactive2dnum[jj])>=0;jj++)
2332 lin[j]+=tmp_lin[totdoc*thr+j];
2350 for (i=0;i<totdoc;i++) {
2351 shrink_state->inactive_since[i]=shrink_state->deactnum-1;
2352 if(!inconsistent[i]) {
2356 if((a[i]>
learn_parm->epsilon_a) && (dist > target)) {
2357 if((dist-target)>(*maxdiff))
2358 (*maxdiff)=dist-target;
2360 else if((a[i]<ex_c) && (dist < target)) {
2361 if((target-dist)>(*maxdiff))
2362 (*maxdiff)=target-dist;
2366 shrink_state->active[i]=1;
2369 shrink_state->active[i]=1;
2371 else if((a[i]>=ex_c)
2372 && (dist > (target-
learn_parm->epsilon_shrink))) {
2373 shrink_state->active[i]=1;
2376 shrink_state->active[i]=1;
2382 for (i=0;i<totdoc;i++) {
2383 (shrink_state->a_history[shrink_state->deactnum-1])[i]=a[i];
2385 for (t=shrink_state->deactnum-2;(t>=0) && shrink_state->a_history[t];t--) {
2386 SG_FREE(shrink_state->a_history[t]);
2387 shrink_state->a_history[t]=0;
2397 int32_t& svm_maxqpsize)
2399 register int32_t i, j, result;
2400 float64_t margin, obj_before, obj_after;
2410 for(i=0;i<qp->opt_n;i++) {
2411 obj_before+=(qp->opt_g0[i]*qp->opt_xinit[i]);
2412 obj_before+=(0.5*qp->opt_xinit[i]*qp->opt_xinit[i]*qp->opt_g[i*qp->opt_n+i]);
2414 obj_before+=(qp->opt_xinit[j]*qp->opt_xinit[i]*qp->opt_g[j*qp->opt_n+i]);
2419 qp->opt_ce0[0]*=(-1.0);
2428 result=
pr_loqo((int32_t)qp->opt_n,(int32_t)qp->opt_m,
2439 SG_SDEBUG(
"Restarting PR_LOQO with more conservative parameters.\n");
2444 margin=(margin+1.0)/2.0;
2447 SG_SDEBUG(
"Reducing precision of PR_LOQO.\n");
2455 SG_SDEBUG(
"Reducing precision of PR_LOQO due to (%ld).\n",result);
2468 for(i=0;i<qp->opt_n;i++) {
2470 dist+=(qp->opt_g0[i]+1.0);
2472 dist+=(
primal[j]*qp->opt_g[j*qp->opt_n+i]);
2474 for(j=i;j<qp->opt_n;j++) {
2475 dist+=(
primal[j]*qp->opt_g[i*qp->opt_n+j]);
2478 if((
primal[i]<(qp->opt_up[i]-epsilon_loqo)) && (dist < (1.0-(*epsilon_crit)))) {
2479 epsilon_loqo=(qp->opt_up[i]-
primal[i])*2.0;
2481 else if((
primal[i]>(0+epsilon_loqo)) && (dist > (1.0+(*epsilon_crit)))) {
2482 epsilon_loqo=
primal[i]*2.0;
2486 for(i=0;i<qp->opt_n;i++) {
2487 if(
primal[i]<=(0+epsilon_loqo)) {
2490 else if(
primal[i]>=(qp->opt_up[i]-epsilon_loqo)) {
2496 for(i=0;i<qp->opt_n;i++) {
2497 obj_after+=(qp->opt_g0[i]*
primal[i]);
2498 obj_after+=(0.5*
primal[i]*
primal[i]*qp->opt_g[i*qp->opt_n+i]);
2500 obj_after+=(
primal[j]*
primal[i]*qp->opt_g[j*qp->opt_n+i]);
2507 for(i=0;i<qp->opt_n;i++) {
2508 primal[i]=qp->opt_xinit[i];
2511 if(svm_maxqpsize>2) {
2516 if(obj_after >= obj_before) {
2520 SG_SDEBUG(
"Increasing Precision of PR_LOQO.\n");
2526 (*epsilon_crit)*=10.0;
2528 SG_SINFO(
"Relaxing epsilon on KT-Conditions.\n");
2534 SG_SERROR(
"PR_LOQO did not converge.\n");
2535 return(qp->opt_xinit);
2543 #endif //USE_SVMLIGHT