71 #define HISTORY_BUF 1000000
73 #define MINUS_INF INT_MIN
74 #define PLUS_INF INT_MAX
76 #define INDEX(ROW,COL,DIM) ((COL*DIM)+ROW)
77 #define KDELTA(A,B) (A==B)
78 #define KDELTA4(A1,A2,A3,A4) ((A1==A2)||(A1==A3)||(A1==A4)||(A2==A3)||(A2==A4)||(A3==A4))
102 int32_t num_virt_data, int32_t num_classes,
float64_t reg_const)
131 for(int32_t i = 0; i < 3; i++ )
139 for(int32_t i = 0; i < num_virt_data; i++ )
148 for(int32_t i = 0; i < 3; i++ )
288 int32_t History_size;
296 if( Ha == NULL )
SG_ERROR(
"Not enough memory.")
299 History = SG_MALLOC(
float64_t, History_size*2);
300 if( History == NULL )
SG_ERROR(
"Not enough memory.")
303 for( tmp1 =
PLUS_INF, i = 0; i < dim; i++ ) {
304 tmp = 0.5*
diag_H[i] + vector_c[i];
313 for( min_beta =
PLUS_INF, i = 0; i < dim; i++ )
318 beta = Ha[i] + vector_c[i];
319 if( beta < min_beta ) {
330 LB = min_beta - 0.5*aHa;
333 History[
INDEX(0,0,2)] = LB;
334 History[
INDEX(1,0,2)] = UB;
337 SG_PRINT(
"Init: UB=%f, LB=%f, UB-LB=%f, (UB-LB)/|UB|=%f \n",
338 UB, LB, UB-LB,(UB-LB)/UB);
342 if( UB-LB <= tolabs ) exitflag = 1;
343 else if(UB-LB <=
CMath::abs(UB)*tolrel ) exitflag = 2;
344 else if(LB > th ) exitflag = 3;
352 while( exitflag == -1 )
363 lambda = (Ha[v]-Ha[u]+vector_c[v]-vector_c[u])/(alpha[v]*(Huu-2*Huv+Hvv));
364 if( lambda < 0 ) lambda = 0;
else if (lambda > 1) lambda = 1;
366 aHa = aHa + 2*alpha[v]*lambda*(Ha[u]-Ha[v])+
367 lambda*lambda*alpha[v]*alpha[v]*(Huu-2*Huv+Hvv);
369 ac = ac + lambda*alpha[v]*(vector_c[u]-vector_c[v]);
372 alpha[u]=alpha[u]+lambda*alpha[v];
373 alpha[v]=alpha[v]-lambda*alpha[v];
378 for( min_beta =
PLUS_INF, i = 0; i < dim; i++ )
380 Ha[i] = Ha[i] + lambda*tmp*(col_u[i] - col_v[i]);
382 beta = Ha[i]+ vector_c[i];
384 if( beta < min_beta )
391 LB = min_beta - 0.5*aHa;
396 for( max_improv =
MINUS_INF, i = 0; i < dim; i++ ) {
398 if( alpha[i] != 0 ) {
399 beta = Ha[i] + vector_c[i];
401 if( beta >= min_beta ) {
405 improv = (0.5*(beta-min_beta)*(beta-min_beta))/tmp;
407 if( improv > max_improv ) {
417 if( UB-LB <= tolabs ) exitflag = 1;
418 else if( UB-LB <=
CMath::abs(UB)*tolrel) exitflag = 2;
419 else if(LB > th ) exitflag = 3;
420 else if(t >= tmax) exitflag = 0;
427 if(verb && (t % verb) == 0 ) {
428 SG_PRINT(
"%d: UB=%f, LB=%f, UB-LB=%f, (UB-LB)/|UB|=%f \n",
429 t, UB, LB, UB-LB,(UB-LB)/UB);
433 if( t < History_size ) {
434 History[
INDEX(0,t,2)] = LB;
435 History[
INDEX(1,t,2)] = UB;
439 if( tmp_ptr == NULL )
SG_ERROR(
"Not enough memory.")
440 for( i = 0; i < History_size; i++ ) {
441 tmp_ptr[
INDEX(0,i,2)] = History[
INDEX(0,i,2)];
442 tmp_ptr[
INDEX(1,i,2)] = History[
INDEX(1,i,2)];
444 tmp_ptr[
INDEX(0,t,2)] = LB;
445 tmp_ptr[
INDEX(1,t,2)] = UB;
455 if(verb && (t % verb) ) {
456 SG_PRINT(
"exit: UB=%f, LB=%f, UB-LB=%f, (UB-LB)/|UB|=%f \n",
457 UB, LB, UB-LB,(UB-LB)/UB);
465 (*ptr_History) = History;
float64_t * virt_columns[3]
static float64_t log10(float64_t v)
float64_t ** kernel_columns
float64_t kernel(int32_t idx_a, int32_t idx_b)
float64_t * get_col(int32_t a, int32_t b)
void get_indices2(int32_t *index, int32_t *c, int32_t i)
float64_t kernel_fce(int32_t a, int32_t b)
Class SGObject is the base class of all shogun objects.
int8_t gmnp_imdm(float64_t *vector_c, int32_t dim, int32_t tmax, float64_t tolabs, float64_t tolrel, float64_t th, float64_t *alpha, int32_t *ptr_t, float64_t **ptr_History, int32_t verb)
#define INDEX(ROW, COL, DIM)
#define SG_ABS_PROGRESS(...)
all of classes and functions are contained in the shogun namespace
float64_t * get_kernel_col(int32_t a)
#define SG_UNSTABLE(func,...)
#define KDELTA4(A1, A2, A3, A4)