24 using namespace shogun;
26 #define HISTORY_BUF 1000000
28 #define MINUS_INF INT_MIN
29 #define PLUS_INF INT_MAX
31 #define INDEX(ROW,COL,DIM) ((COL*DIM)+ROW)
110 float64_t min_beta1, max_beta1, min_beta2, max_beta2, beta;
123 int64_t History_size;
131 if( Ha1 == NULL )
SG_ERROR(
"Not enough memory.\n")
133 if( Ha2 == NULL )
SG_ERROR(
"Not enough memory.\n")
136 History = SG_MALLOC(
float64_t, History_size*2);
137 if( History == NULL )
SG_ERROR(
"Not enough memory.\n")
140 v1 = -1; v2 = -1; i = 0;
141 while( (v1 == -1 || v2 == -1) && i < dim ) {
142 if( v1 == -1 && vector_y[i] == 1 ) { v1 = i; }
143 if( v2 == -1 && vector_y[i] == 2 ) { v2 = i; }
157 for( i = 0; i < dim; i++ )
163 beta = Ha1[i] + Ha2[i] + vector_c[i];
165 if( vector_y[i] == 1 && min_beta1 > beta ) {
170 if( vector_y[i] == 2 && min_beta2 > beta ) {
179 UB = 0.5*(aHa11 + 2*aHa12 + aHa22) + ac1 + ac2;
180 LB = min_beta1 + min_beta2 - 0.5*(aHa11 + 2*aHa12 + aHa22);
182 delta1 = Ha1[v1] + Ha2[v1] + vector_c[v1] - min_beta1;
183 delta2 = Ha1[v2] + Ha2[v2] + vector_c[v2] - min_beta2;
186 History[
INDEX(0,0,2)] = LB;
187 History[
INDEX(1,0,2)] = UB;
190 SG_PRINT(
"Init: UB=%f, LB=%f, UB-LB=%f, (UB-LB)/|UB|=%f \n",
191 UB, LB, UB-LB,(UB-LB)/UB);
195 if( UB-LB <= tolabs ) exitflag = 1;
196 else if(UB-LB <=
CMath::abs(UB)*tolrel ) exitflag = 2;
197 else if(LB > th) exitflag = 3;
204 while( exitflag == -1 )
208 if( delta1 > delta2 )
217 lambda = delta1/(alpha[v1]*(Huu - 2*Huv + Hvv ));
220 tmp = lambda*alpha[v1];
222 aHa11 = aHa11 + 2*tmp*(Ha1[u1]-Ha1[v1])+tmp*tmp*( Huu - 2*Huv + Hvv );
223 aHa12 = aHa12 + tmp*(Ha2[u1]-Ha2[v1]);
224 ac1 = ac1 + tmp*(vector_c[u1]-vector_c[v1]);
226 alpha[u1] = alpha[u1] + tmp;
227 alpha[v1] = alpha[v1] - tmp;
231 for( i = 0; i < dim; i ++ )
233 Ha1[i] = Ha1[i] + tmp*(col_u[i] - col_v[i]);
235 beta = Ha1[i] + Ha2[i] + vector_c[i];
236 if( vector_y[i] == 1 )
238 if( min_beta1 > beta ) { u1 = i; min_beta1 = beta; }
239 if( max_beta1 < beta && alpha[i] > 0 ) { v1 = i; max_beta1 = beta; }
243 if( min_beta2 > beta ) { u2 = i; min_beta2 = beta; }
244 if( max_beta2 < beta && alpha[i] > 0) { v2 = i; max_beta2 = beta; }
257 lambda = delta2/(alpha[v2]*( Huu - 2*Huv + Hvv ));
260 tmp = lambda*alpha[v2];
261 aHa22 = aHa22 + 2*tmp*( Ha2[u2]-Ha2[v2]) + tmp*tmp*( Huu - 2*Huv + Hvv);
262 aHa12 = aHa12 + tmp*(Ha1[u2]-Ha1[v2]);
263 ac2 = ac2 + tmp*( vector_c[u2]-vector_c[v2] );
265 alpha[u2] = alpha[u2] + tmp;
266 alpha[v2] = alpha[v2] - tmp;
270 for(i = 0; i < dim; i++ )
272 Ha2[i] = Ha2[i] + tmp*( col_u[i] - col_v[i] );
274 beta = Ha1[i] + Ha2[i] + vector_c[i];
276 if( vector_y[i] == 1 )
278 if( min_beta1 > beta ) { u1 = i; min_beta1 = beta; }
279 if( max_beta1 < beta && alpha[i] > 0 ) { v1 = i; max_beta1 = beta; }
283 if( min_beta2 > beta ) { u2 = i; min_beta2 = beta; }
284 if( max_beta2 < beta && alpha[i] > 0) { v2 = i; max_beta2 = beta; }
289 UB = 0.5*(aHa11 + 2*aHa12 + aHa22) + ac1 + ac2;
290 LB = min_beta1 + min_beta2 - 0.5*(aHa11 + 2*aHa12 + aHa22);
292 delta1 = Ha1[v1] + Ha2[v1] + vector_c[v1] - min_beta1;
293 delta2 = Ha1[v2] + Ha2[v2] + vector_c[v2] - min_beta2;
296 if( UB-LB <= tolabs ) exitflag = 1;
297 else if( UB-LB <=
CMath::abs(UB)*tolrel ) exitflag = 2;
298 else if(LB > th) exitflag = 3;
299 else if(t >= tmax) exitflag = 0;
301 if( verb && (t % verb) == 0) {
302 SG_PRINT(
"%d: UB=%f,LB=%f,UB-LB=%f,(UB-LB)/|UB|=%f\n",
303 t, UB, LB, UB-LB,(UB-LB)/UB);
307 if( t < History_size ) {
308 History[
INDEX(0,t,2)] = LB;
309 History[
INDEX(1,t,2)] = UB;
313 if( tmp_ptr == NULL )
SG_ERROR(
"Not enough memory.\n")
314 for( i = 0; i < History_size; i++ ) {
315 tmp_ptr[
INDEX(0,i,2)] = History[
INDEX(0,i,2)];
316 tmp_ptr[
INDEX(1,i,2)] = History[
INDEX(1,i,2)];
318 tmp_ptr[
INDEX(0,t,2)] = LB;
319 tmp_ptr[
INDEX(1,t,2)] = UB;
328 if(verb && (t % verb) ) {
329 SG_PRINT(
"Exit: UB=%f, LB=%f, UB-LB=%f, (UB-LB)/|UB|=%f \n",
330 UB, LB, UB-LB,(UB-LB)/UB);
337 (*ptr_aHa11) = aHa11;
338 (*ptr_aHa22) = aHa22;
339 (*ptr_History) = History;
375 float64_t min_beta1, max_beta1, min_beta2, max_beta2, beta;
389 int64_t History_size;
398 if( Ha1 == NULL )
SG_ERROR(
"Not enough memory.\n")
400 if( Ha2 == NULL )
SG_ERROR(
"Not enough memory.\n")
403 History = SG_MALLOC(
float64_t, History_size*2);
404 if( History == NULL )
SG_ERROR(
"Not enough memory.\n")
407 v1 = -1; v2 = -1; i = 0;
408 while( (v1 == -1 || v2 == -1) && i < dim ) {
409 if( v1 == -1 && vector_y[i] == 1 ) { v1 = i; }
410 if( v2 == -1 && vector_y[i] == 2 ) { v2 = i; }
424 for( i = 0; i < dim; i++ )
430 beta = Ha1[i] + Ha2[i] + vector_c[i];
432 if( vector_y[i] == 1 && min_beta1 > beta ) {
437 if( vector_y[i] == 2 && min_beta2 > beta ) {
446 UB = 0.5*(aHa11 + 2*aHa12 + aHa22) + ac1 + ac2;
447 LB = min_beta1 + min_beta2 - 0.5*(aHa11 + 2*aHa12 + aHa22);
449 delta1 = Ha1[v1] + Ha2[v1] + vector_c[v1] - min_beta1;
450 delta2 = Ha1[v2] + Ha2[v2] + vector_c[v2] - min_beta2;
453 History[
INDEX(0,0,2)] = LB;
454 History[
INDEX(1,0,2)] = UB;
457 SG_PRINT(
"Init: UB=%f, LB=%f, UB-LB=%f, (UB-LB)/|UB|=%f \n",
458 UB, LB, UB-LB,(UB-LB)/UB);
461 if( delta1 > delta2 )
475 if( UB-LB <= tolabs ) exitflag = 1;
476 else if(UB-LB <=
CMath::abs(UB)*tolrel ) exitflag = 2;
477 else if(LB > th) exitflag = 3;
484 while( exitflag == -1 )
488 if( which_case == 1 )
494 lambda = delta1/(alpha[v1]*(Huu - 2*Huv + Hvv ));
497 tmp = lambda*alpha[v1];
499 aHa11 = aHa11 + 2*tmp*(Ha1[u1]-Ha1[v1])+tmp*tmp*( Huu - 2*Huv + Hvv );
500 aHa12 = aHa12 + tmp*(Ha2[u1]-Ha2[v1]);
501 ac1 = ac1 + tmp*(vector_c[u1]-vector_c[v1]);
503 alpha[u1] = alpha[u1] + tmp;
504 alpha[v1] = alpha[v1] - tmp;
508 for( i = 0; i < dim; i ++ )
510 Ha1[i] = Ha1[i] + tmp*(col_u[i] - col_v[i]);
512 beta = Ha1[i] + Ha2[i] + vector_c[i];
513 if( vector_y[i] == 1 )
515 if( min_beta1 > beta ) { u1 = i; min_beta1 = beta; }
516 if( max_beta1 < beta && alpha[i] > 0 ) { v1 = i; max_beta1 = beta; }
520 if( min_beta2 > beta ) { u2 = i; min_beta2 = beta; }
521 if( max_beta2 < beta && alpha[i] > 0) { v2 = i; max_beta2 = beta; }
531 lambda = delta2/(alpha[v2]*( Huu - 2*Huv + Hvv ));
534 tmp = lambda*alpha[v2];
535 aHa22 = aHa22 + 2*tmp*( Ha2[u2]-Ha2[v2]) + tmp*tmp*( Huu - 2*Huv + Hvv);
536 aHa12 = aHa12 + tmp*(Ha1[u2]-Ha1[v2]);
537 ac2 = ac2 + tmp*( vector_c[u2]-vector_c[v2] );
539 alpha[u2] = alpha[u2] + tmp;
540 alpha[v2] = alpha[v2] - tmp;
544 for(i = 0; i < dim; i++ )
546 Ha2[i] = Ha2[i] + tmp*( col_u[i] - col_v[i] );
548 beta = Ha1[i] + Ha2[i] + vector_c[i];
550 if( vector_y[i] == 1 )
552 if( min_beta1 > beta ) { u1 = i; min_beta1 = beta; }
553 if( max_beta1 < beta && alpha[i] > 0 ) { v1 = i; max_beta1 = beta; }
557 if( min_beta2 > beta ) { u2 = i; min_beta2 = beta; }
558 if( max_beta2 < beta && alpha[i] > 0) { v2 = i; max_beta2 = beta; }
563 UB = 0.5*(aHa11 + 2*aHa12 + aHa22) + ac1 + ac2;
564 LB = min_beta1 + min_beta2 - 0.5*(aHa11 + 2*aHa12 + aHa22);
566 delta1 = Ha1[v1] + Ha2[v1] + vector_c[v1] - min_beta1;
567 delta2 = Ha1[v2] + Ha2[v2] + vector_c[v2] - min_beta2;
569 if( delta1 > delta2 )
574 for( max_improv =
MINUS_INF, i = 0; i < dim; i++ ) {
576 if( vector_y[i] == 1 && alpha[i] != 0 ) {
578 beta = Ha1[i] + Ha2[i] + vector_c[i];
580 if( beta >= min_beta1 ) {
582 tmp = diag_H[u1] - 2*col_u[i] + diag_H[i];
584 improv = (0.5*(beta-min_beta1)*(beta-min_beta1))/tmp;
586 if( improv > max_improv ) {
595 delta1 = Ha1[v1] + Ha2[v1] + vector_c[v1] - min_beta1;
604 for( max_improv =
MINUS_INF, i = 0; i < dim; i++ ) {
606 if( vector_y[i] == 2 && alpha[i] != 0 ) {
608 beta = Ha1[i] + Ha2[i] + vector_c[i];
610 if( beta >= min_beta2 ) {
612 tmp = diag_H[u2] - 2*col_u[i] + diag_H[i];
614 improv = (0.5*(beta-min_beta2)*(beta-min_beta2))/tmp;
616 if( improv > max_improv ) {
626 delta2 = Ha1[v2] + Ha2[v2] + vector_c[v2] - min_beta2;
632 if( UB-LB <= tolabs ) exitflag = 1;
633 else if( UB-LB <=
CMath::abs(UB)*tolrel ) exitflag = 2;
634 else if(LB > th) exitflag = 3;
635 else if(t >= tmax) exitflag = 0;
637 if( verb && (t % verb) == 0) {
638 SG_PRINT(
"%d: UB=%f,LB=%f,UB-LB=%f,(UB-LB)/|UB|=%f\n",
639 t, UB, LB, UB-LB,(UB-LB)/UB);
643 if( t < History_size ) {
644 History[
INDEX(0,t,2)] = LB;
645 History[
INDEX(1,t,2)] = UB;
649 if( tmp_ptr == NULL )
SG_ERROR(
"Not enough memory.\n")
650 for( i = 0; i < History_size; i++ ) {
651 tmp_ptr[
INDEX(0,i,2)] = History[
INDEX(0,i,2)];
652 tmp_ptr[
INDEX(1,i,2)] = History[
INDEX(1,i,2)];
654 tmp_ptr[
INDEX(0,t,2)] = LB;
655 tmp_ptr[
INDEX(1,t,2)] = UB;
664 if(verb && (t % verb) ) {
665 SG_PRINT(
"Exit: UB=%f, LB=%f, UB-LB=%f, (UB-LB)/|UB|=%f \n",
666 UB, LB, UB-LB,(UB-LB)/UB);
673 (*ptr_aHa11) = aHa11;
674 (*ptr_aHa22) = aHa22;
675 (*ptr_History) = History;