28 #include <ilcplex/cplex.h>
38 using namespace shogun;
40 #ifndef DOXYGEN_SHOULD_SKIP_THIS
41 struct S_THREAD_PARAM_SVRLIGHT
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")
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;
173 docs=SG_MALLOC(int32_t, 2*totdoc);
174 label=SG_MALLOC(int32_t, 2*totdoc);
177 for(i=0;i<totdoc;i++) {
203 timing_profile.time_kernel=0;
204 timing_profile.time_opti=0;
205 timing_profile.time_shrink=0;
206 timing_profile.time_update=0;
207 timing_profile.time_model=0;
208 timing_profile.time_check=0;
209 timing_profile.time_select=0;
229 inconsistent = SG_MALLOC(int32_t, totdoc);
231 a_fullset = SG_MALLOC(
float64_t, totdoc);
232 xi_fullset = SG_MALLOC(
float64_t, totdoc);
243 SG_FREE(
model->supvec);
244 SG_FREE(
model->alpha);
245 SG_FREE(
model->index);
246 model->supvec = SG_MALLOC(int32_t, totdoc+2);
248 model->index = SG_MALLOC(int32_t, totdoc+2);
250 model->at_upper_bound=0;
254 model->totdoc=totdoc;
260 model->loo_recall=-1;
261 model->loo_precision=-1;
264 model->xa_precision=-1;
266 for(i=0;i<totdoc;i++) {
275 else if(label[i] < 0) {
289 &shrink_state,inconsistent,a,lin,
291 &maxdiff,(int32_t)-1,
297 SG_INFO(
"(%ld iterations)\n",iterations)
298 SG_INFO(
"Optimization finished (maxdiff=%.8f).\n",maxdiff)
304 for(i=1;i<
model->sv_num;i++)
306 if(fabs(
model->alpha[i]) >=
311 SG_INFO(
"Number of SV: %d (including %d at upper bound)\n",
312 model->sv_num-1,upsupvecnum);
317 for(i=1;i<
model->sv_num;i++) {
319 if(j >= (totdoc/2)) {
327 SG_FREE(inconsistent);
344 for(int32_t i=0;i<totdoc;i++)
345 criterion+=(eps[i]-(
float64_t)label[i]*c[i])*a[i]+0.5*a[i]*label[i]*lin[i];
363 S_THREAD_PARAM_SVRLIGHT * params = (S_THREAD_PARAM_SVRLIGHT*) params_ ;
367 for(jj=params->start;(jj<params->end) && (j=params->active2dnum[jj])>=0;jj++)
382 int32_t i, int32_t num_vectors)
398 int32_t* docs, int32_t* label, int32_t *active2dnum,
float64_t *a,
406 register int32_t i=0,ii=0,j=0,jj=0;
413 totdoc, lin, aicache, c) ;
419 int32_t num_working=0;
420 for(ii=0;(i=working2dnum[ii])>=0;ii++) {
421 if(a[i] != a_old[i]) {
431 for(jj=0;(j=active2dnum[jj])>=0;jj++) {
438 int32_t num_elem = 0 ;
439 for(jj=0;(j=active2dnum[jj])>=0;jj++) num_elem++ ;
449 params[t].kernel =
kernel ;
450 params[t].lin = lin ;
451 params[t].docs = docs ;
452 params[t].active2dnum=active2dnum ;
453 params[t].start = start ;
454 params[t].end = end ;
467 pthread_join(threads[t], &ret) ;
481 a, a_old, working2dnum, totdoc, lin, aicache, c) ;
484 for(jj=0;(i=working2dnum[jj])>=0;jj++) {
485 if(a[i] != a_old[i]) {
487 for(ii=0;(j=active2dnum[ii])>=0;ii++)
488 lin[j]+=(a[i]-a_old[i])*aicache[j]*(
float64_t)label[i];
496 int32_t* docs, int32_t* label, int32_t *active2dnum,
float64_t *a,
500 int32_t num = totdoc;
501 int32_t num_weights = -1;
505 ASSERT(num_weights==num_kernels)
512 int32_t n = 0, i, j ;
536 for (int32_t i=0; i<num_kernels; i++)
538 w_backup[i] = old_beta[i] ;
541 for (int32_t n=0; n<num_kernels; n++)
546 for(int32_t i=0;i<num;i++)
550 for(int32_t j=0;j<num;j++)
569 int32_t* docs, int32_t* label, int32_t *active2dnum,
float64_t *a,
575 int32_t num_weights = -1;
579 ASSERT(num_weights==num_kernels)
585 for (int32_t i=0; i<num_kernels; i++)
587 w_backup[i] = old_beta[i] ;
595 for(int32_t ii=0, i=0;(i=working2dnum[ii])>=0;ii++) {
596 if(a[i] != a_old[i]) {
613 int32_t num = totdoc;
618 for (int32_t i=0; i<num; i++)
619 sumalpha-=a[i]*(
learn_parm->eps[i]-label[i]*c[i]);
622 int nk = (int) num_kernels;
623 double* alphay = SG_MALLOC(
double, num);
624 for (int32_t i=0; i<num; i++)
625 alphay[i]=a[i]*label[i];
627 for (int32_t i=0; i<num_kernels; i++)
630 cblas_dgemv(CblasColMajor, CblasNoTrans, nk, (
int) num, 0.5, (
double*)
W,
631 nk, (
double*) alphay, 1, 1.0, (
double*) sumw, 1);
635 for (int32_t d=0; d<num_kernels; d++)
638 for(int32_t i=0; i<num; i++)
639 sumw[d] += 0.5*a[i]*label[i]*
W[i*num_kernels+d];
650 cblas_dgemv(CblasColMajor, CblasTrans, nk, (
int) num, 1.0, (
double*)
W,
651 nk, (
double*) new_beta, 1, 0.0, (
double*) lin, 1);
653 for(int32_t i=0; i<num; i++)
655 for (int32_t d=0; d<num_kernels; d++)
657 for(int32_t i=0; i<num; i++)
658 lin[i] += new_beta[d]*
W[i*num_kernels+d] ;
668 float64_t *c, int32_t totdoc, int32_t iteration, int32_t *inconsistent,
674 register int32_t i=0,j,ii=0,jj,t,*changed2dnum,*inactive2dnum;
675 int32_t *changed,*inactive;
680 a_old=shrink_state->last_a;
683 int32_t num_modified=0;
684 for(i=0;i<totdoc;i++) {
685 if(a[i] != a_old[i]) {
694 for(i=0;i<totdoc;i++) {
695 if(!shrink_state->active[i]) {
698 shrink_state->last_lin[i]=lin[i];
704 changed=SG_MALLOC(int32_t, totdoc);
705 changed2dnum=SG_MALLOC(int32_t, totdoc+11);
706 inactive=SG_MALLOC(int32_t, totdoc);
707 inactive2dnum=SG_MALLOC(int32_t, totdoc+11);
708 for(t=shrink_state->deactnum-1;(t>=0) && shrink_state->a_history[t];t--) {
712 a_old=shrink_state->a_history[t];
713 for(i=0;i<totdoc;i++) {
714 inactive[i]=((!shrink_state->active[i])
715 && (shrink_state->inactive_since[i] == t));
716 changed[i]= (a[i] != a_old[i]);
721 for(ii=0;(i=changed2dnum[ii])>=0;ii++) {
723 for(jj=0;(j=inactive2dnum[jj])>=0;jj++)
724 lin[j]+=(a[i]-a_old[i])*aicache[j]*(
float64_t)label[i];
728 SG_FREE(changed2dnum);
730 SG_FREE(inactive2dnum);
734 for(i=0;i<totdoc;i++) {
735 shrink_state->inactive_since[i]=shrink_state->deactnum-1;
736 if(!inconsistent[i]) {
740 if((a[i]>
learn_parm->epsilon_a) && (dist > target)) {
741 if((dist-target)>(*maxdiff))
742 (*maxdiff)=dist-target;
744 else if((a[i]<ex_c) && (dist < target)) {
745 if((target-dist)>(*maxdiff))
746 (*maxdiff)=target-dist;
750 shrink_state->active[i]=1;
753 shrink_state->active[i]=1;
756 && (dist > (target-
learn_parm->epsilon_shrink))) {
757 shrink_state->active[i]=1;
760 shrink_state->active[i]=1;
765 for(i=0;i<totdoc;i++) {
766 (shrink_state->a_history[shrink_state->deactnum-1])[i]=a[i];
768 for(t=shrink_state->deactnum-2;(t>=0) && shrink_state->a_history[t];t--) {
769 SG_FREE(shrink_state->a_history[t]);
770 shrink_state->a_history[t]=0;
774 #endif //USE_SVMLIGHT