28 #include <ilcplex/cplex.h>
38 using namespace shogun;
40 #ifndef DOXYGEN_SHOULD_SKIP_THIS
50 #endif // DOXYGEN_SHOULD_SKIP_THIS
104 SG_ERROR(
"SVR_light can not proceed without kernel!\n");
110 SG_ERROR(
"SVR_light can not proceed without labels!\n");
117 SG_ERROR(
"Number of training vectors does not match number of labels\n");
135 SG_DEBUG(
"use_kernel_cache = %i\n", use_kernel_cache) ;
143 for (int32_t i=0; i<
model->sv_num-1; i++)
157 int32_t *inconsistent, i, j;
163 TIMING timing_profile;
164 SHRINK_STATE shrink_state;
177 for(i=0;i<totdoc;i++) {
204 timing_profile.time_kernel=0;
205 timing_profile.time_opti=0;
206 timing_profile.time_shrink=0;
207 timing_profile.time_update=0;
208 timing_profile.time_model=0;
209 timing_profile.time_check=0;
210 timing_profile.time_select=0;
230 inconsistent =
SG_MALLOC(int32_t, totdoc);
251 model->at_upper_bound=0;
255 model->totdoc=totdoc;
261 model->loo_recall=-1;
262 model->loo_precision=-1;
265 model->xa_precision=-1;
267 for(i=0;i<totdoc;i++) {
276 else if(label[i] < 0) {
288 SG_DEBUG(
"num_train: %d\n", totdoc);
290 &shrink_state,inconsistent,a,lin,
292 &maxdiff,(int32_t)-1,
298 SG_INFO(
"(%ld iterations)\n",iterations);
299 SG_INFO(
"Optimization finished (maxdiff=%.8f).\n",maxdiff);
305 for(i=1;i<
model->sv_num;i++)
307 if(fabs(
model->alpha[i]) >=
312 SG_INFO(
"Number of SV: %ld (including %ld at upper bound)\n",
313 model->sv_num-1,upsupvecnum);
318 for(i=1;i<
model->sv_num;i++) {
320 if(j >= (totdoc/2)) {
345 for(int32_t i=0;i<totdoc;i++)
346 criterion+=(eps[i]-(
float64_t)label[i]*c[i])*a[i]+0.5*a[i]*label[i]*lin[i];
364 S_THREAD_PARAM * params = (S_THREAD_PARAM*) params_ ;
368 for(jj=params->start;(jj<params->end) && (j=params->active2dnum[jj])>=0;jj++)
383 int32_t i, int32_t num_vectors)
399 int32_t* docs, int32_t* label, int32_t *active2dnum,
float64_t *a,
407 register int32_t i=0,ii=0,j=0,jj=0;
414 totdoc, lin, aicache, c) ;
420 int32_t num_working=0;
421 for(ii=0;(i=working2dnum[ii])>=0;ii++) {
422 if(a[i] != a_old[i]) {
432 for(jj=0;(j=active2dnum[jj])>=0;jj++) {
439 int32_t num_elem = 0 ;
440 for(jj=0;(j=active2dnum[jj])>=0;jj++) num_elem++ ;
450 params[t].kernel =
kernel ;
451 params[t].lin = lin ;
452 params[t].docs = docs ;
453 params[t].active2dnum=active2dnum ;
454 params[t].start = start ;
455 params[t].end = end ;
468 pthread_join(threads[t], &ret) ;
482 a, a_old, working2dnum, totdoc, lin, aicache, c) ;
485 for(jj=0;(i=working2dnum[jj])>=0;jj++) {
486 if(a[i] != a_old[i]) {
488 for(ii=0;(j=active2dnum[ii])>=0;ii++)
489 lin[j]+=(a[i]-a_old[i])*aicache[j]*(
float64_t)label[i];
497 int32_t* docs, int32_t* label, int32_t *active2dnum,
float64_t *a,
501 int32_t num = totdoc;
502 int32_t num_weights = -1;
506 ASSERT(num_weights==num_kernels);
513 int32_t n = 0, i, j ;
537 for (int32_t i=0; i<num_kernels; i++)
539 w_backup[i] = old_beta[i] ;
542 for (int32_t n=0; n<num_kernels; n++)
547 for(int32_t i=0;i<num;i++)
551 for(int32_t j=0;j<num;j++)
570 int32_t* docs, int32_t* label, int32_t *active2dnum,
float64_t *a,
576 int32_t num_weights = -1;
580 ASSERT(num_weights==num_kernels);
586 for (int32_t i=0; i<num_kernels; i++)
588 w_backup[i] = old_beta[i] ;
596 for(int32_t ii=0, i=0;(i=working2dnum[ii])>=0;ii++) {
597 if(a[i] != a_old[i]) {
614 int32_t num = totdoc;
619 for (int32_t i=0; i<num; i++)
620 sumalpha-=a[i]*(
learn_parm->eps[i]-label[i]*c[i]);
623 int nk = (int) num_kernels;
625 for (int32_t i=0; i<num; i++)
626 alphay[i]=a[i]*label[i];
628 for (int32_t i=0; i<num_kernels; i++)
631 cblas_dgemv(CblasColMajor, CblasNoTrans, nk, (
int) num, 0.5, (
double*)
W,
632 nk, (
double*) alphay, 1, 1.0, (
double*) sumw, 1);
636 for (int32_t d=0; d<num_kernels; d++)
639 for(int32_t i=0; i<num; i++)
640 sumw[d] += 0.5*a[i]*label[i]*
W[i*num_kernels+d];
651 cblas_dgemv(CblasColMajor, CblasTrans, nk, (
int) num, 1.0, (
double*)
W,
652 nk, (
double*) new_beta, 1, 0.0, (
double*) lin, 1);
654 for(int32_t i=0; i<num; i++)
656 for (int32_t d=0; d<num_kernels; d++)
658 for(int32_t i=0; i<num; i++)
659 lin[i] += new_beta[d]*
W[i*num_kernels+d] ;
669 float64_t *c, int32_t totdoc, int32_t iteration, int32_t *inconsistent,
675 register int32_t i=0,j,ii=0,jj,t,*changed2dnum,*inactive2dnum;
676 int32_t *changed,*inactive;
681 a_old=shrink_state->last_a;
684 int32_t num_modified=0;
685 for(i=0;i<totdoc;i++) {
686 if(a[i] != a_old[i]) {
695 for(i=0;i<totdoc;i++) {
696 if(!shrink_state->active[i]) {
699 shrink_state->last_lin[i]=lin[i];
706 changed2dnum=
SG_MALLOC(int32_t, totdoc+11);
708 inactive2dnum=
SG_MALLOC(int32_t, totdoc+11);
709 for(t=shrink_state->deactnum-1;(t>=0) && shrink_state->a_history[t];t--) {
713 a_old=shrink_state->a_history[t];
714 for(i=0;i<totdoc;i++) {
715 inactive[i]=((!shrink_state->active[i])
716 && (shrink_state->inactive_since[i] == t));
717 changed[i]= (a[i] != a_old[i]);
722 for(ii=0;(i=changed2dnum[ii])>=0;ii++) {
724 for(jj=0;(j=inactive2dnum[jj])>=0;jj++)
725 lin[j]+=(a[i]-a_old[i])*aicache[j]*(
float64_t)label[i];
735 for(i=0;i<totdoc;i++) {
736 shrink_state->inactive_since[i]=shrink_state->deactnum-1;
737 if(!inconsistent[i]) {
741 if((a[i]>
learn_parm->epsilon_a) && (dist > target)) {
742 if((dist-target)>(*maxdiff))
743 (*maxdiff)=dist-target;
745 else if((a[i]<ex_c) && (dist < target)) {
746 if((target-dist)>(*maxdiff))
747 (*maxdiff)=target-dist;
751 shrink_state->active[i]=1;
754 shrink_state->active[i]=1;
757 && (dist > (target-
learn_parm->epsilon_shrink))) {
758 shrink_state->active[i]=1;
761 shrink_state->active[i]=1;
766 for(i=0;i<totdoc;i++) {
767 (shrink_state->a_history[shrink_state->deactnum-1])[i]=a[i];
769 for(t=shrink_state->deactnum-2;(t>=0) && shrink_state->a_history[t];t--) {
770 SG_FREE(shrink_state->a_history[t]);
771 shrink_state->a_history[t]=0;
775 #endif //USE_SVMLIGHT