61 using namespace shogun;
63 #define HISTORY_BUF 1000000
65 #define INDEX(ROW,COL,DIM) ((COL*DIM)+ROW)
112 for (int32_t i=0; i<
m_dim; i++)
118 for (int32_t i=0; i<
m_dim; i++)
127 case QPB_SOLVER_GRADDESC:
134 status =
qpbsvm_sca(result, Nabla, &t, &History, verb );
136 case QPB_SOLVER_SCAS:
137 status =
qpbsvm_scas(result, Nabla, &t, &History, verb );
139 case QPB_SOLVER_SCAMV:
140 status =
qpbsvm_scamv(result, Nabla, &t, &History, verb );
142 case QPB_SOLVER_PRLOQO:
146 case QPB_SOLVER_CPLEX:
147 status =
qpbsvm_cplex(result, Nabla, &t, &History, verb );
149 SG_ERROR(
"cplex not enabled at compile time - unknow solver\n");
187 int32_t History_size;
201 memset(History, 0,
sizeof(
float64_t)*History_size*2);
207 for(i = 0; i <
m_dim; i++ ) {
208 xHx += x[i]*(Nabla[i] -
m_f[i]);
214 Q_D = -0.5*xHx -
m_UB*xi_sum;
215 History[
INDEX(0,t,2)] = Q_P;
216 History[
INDEX(1,t,2)] = Q_D;
219 SG_PRINT(
"%d: Q_P=%m_f, Q_D=%m_f, Q_P-Q_D=%m_f, (Q_P-Q_D)/|Q_P|=%m_f \n",
220 t, Q_P, Q_D, Q_P-Q_D,(Q_P-Q_D)/
CMath::abs(Q_P));
224 while( exitflag == -1 )
228 for(i = 0; i <
m_dim; i++ ) {
235 delta_x = x[i] - x_old;
238 for(j = 0; j <
m_dim; j++ ) {
239 Nabla[j] += col_H[j]*delta_x;
251 for(i = 0; i <
m_dim; i++ ) {
252 xHx += x[i]*(Nabla[i] -
m_f[i]);
257 (x[i] == 0 && Nabla[i] < -
m_tolKKT) ||
262 Q_D = -0.5*xHx -
m_UB*xi_sum;
265 if(t >=
m_tmax) exitflag = 0;
266 else if(Q_P-Q_D <=
m_tolabs) exitflag = 1;
268 else if(KKTsatisf == 1) exitflag = 3;
270 if( verb > 0 && (t % verb == 0 || t==1)) {
271 SG_PRINT(
"%d: Q_P=%m_f, Q_D=%m_f, Q_P-Q_D=%m_f, (Q_P-Q_D)/|Q_P|=%m_f \n",
272 t, Q_P, Q_D, Q_P-Q_D,(Q_P-Q_D)/
CMath::abs(Q_P));
276 if( t < History_size ) {
277 History[
INDEX(0,t,2)] = Q_P;
278 History[
INDEX(1,t,2)] = Q_D;
284 for( i = 0; i < History_size; i++ ) {
285 tmp_ptr[
INDEX(0,i,2)] = History[
INDEX(0,i,2)];
286 tmp_ptr[
INDEX(1,i,2)] = History[
INDEX(1,i,2)];
288 tmp_ptr[
INDEX(0,t,2)] = Q_P;
289 tmp_ptr[
INDEX(1,t,2)] = Q_D;
298 (*ptr_History) = History;
300 SG_PRINT(
"QP: %f QD: %f\n", Q_P, Q_D);
332 int32_t History_size;
347 memset(History, 0,
sizeof(
float64_t)*History_size*2);
353 for(i = 0; i <
m_dim; i++ ) {
354 xHx += x[i]*(Nabla[i] -
m_f[i]);
360 Q_D = -0.5*xHx -
m_UB*xi_sum;
361 History[
INDEX(0,t,2)] = Q_P;
362 History[
INDEX(1,t,2)] = Q_D;
365 SG_PRINT(
"%d: Q_P=%m_f, Q_D=%m_f, Q_P-Q_D=%m_f, (Q_P-Q_D)/|Q_P|=%m_f \n",
366 t, Q_P, Q_D, Q_P-Q_D,(Q_P-Q_D)/
CMath::abs(Q_P));
370 while( exitflag == -1 )
375 for(i = 0; i <
m_dim; i++ ) {
381 curr_update = -0.5*
m_diag_H[i]*(x_new*x_new-x_old*x_old) -
382 (Nabla[i] -
m_diag_H[i]*x_old)*(x_new - x_old);
384 if( curr_update > max_update ) {
386 max_update = curr_update;
396 delta_x = max_x - x_old;
399 for(j = 0; j <
m_dim; j++ ) {
400 Nabla[j] += col_H[j]*delta_x;
409 for(i = 0; i <
m_dim; i++ ) {
410 xHx += x[i]*(Nabla[i] -
m_f[i]);
415 (x[i] == 0 && Nabla[i] < -
m_tolKKT) ||
420 Q_D = -0.5*xHx -
m_UB*xi_sum;
423 if(t >=
m_tmax) exitflag = 0;
424 else if(Q_P-Q_D <=
m_tolabs) exitflag = 1;
426 else if(KKTsatisf == 1) exitflag = 3;
428 if( verb > 0 && (t % verb == 0 || t==1)) {
429 SG_PRINT(
"%d: Q_P=%m_f, Q_D=%m_f, Q_P-Q_D=%m_f, (Q_P-Q_D)/|Q_P|=%m_f \n",
430 t, Q_P, Q_D, Q_P-Q_D,(Q_P-Q_D)/
CMath::abs(Q_P));
434 if( t < History_size ) {
435 History[
INDEX(0,t,2)] = Q_P;
436 History[
INDEX(1,t,2)] = Q_D;
441 for( i = 0; i < History_size; i++ ) {
442 tmp_ptr[
INDEX(0,i,2)] = History[
INDEX(0,i,2)];
443 tmp_ptr[
INDEX(1,i,2)] = History[
INDEX(1,i,2)];
445 tmp_ptr[
INDEX(0,t,2)] = Q_P;
446 tmp_ptr[
INDEX(1,t,2)] = Q_D;
455 (*ptr_History) = History;
489 while( exitflag == -1 && t <=
m_tmax)
494 for(i = 0; i <
m_dim; i++ )
498 if( max_viol < -Nabla[i]) { u = i; max_viol = -Nabla[i]; }
500 else if( x[i] > 0 && x[i] <
m_UB )
504 else if( max_viol < Nabla[i]) { u = i; max_viol = Nabla[i]; }
518 delta_x = x_new - x[u];
522 for(i = 0; i <
m_dim; i++ ) {
523 Nabla[i] += col_H[i]*delta_x;
529 memset(History, 0,
sizeof(
float64_t)*(t+1)*2);
532 for(fval = 0, i = 0; i <
m_dim; i++ ) {
533 fval += 0.5*x[i]*(Nabla[i]+
m_f[i]);
536 History[
INDEX(0,t,2)] = fval;
537 History[
INDEX(1,t,2)] = 0;
540 (*ptr_History) = History;
565 for (int32_t i=0; i<
m_dim; i++)
575 int32_t result=
pr_loqo(m_dim, 1,
m_f,
m_H, a, &b, lb, ub, primal, dual,
576 2, 5, 1, -0.95, 10,0);
595 for (int32_t i=0; i<
m_dim; i++)
598 for (int32_t t=0; t<200; t++)
600 for (int32_t i=0; i<
m_dim; i++)
603 m_H[m_dim*i+i]*x[i]))/
m_H[m_dim*i+i];
609 for (int32_t i=0; i<
m_dim; i++)
611 if (x[i]==0.0 || x[i]==1.0)
614 SG_PRINT(
"atbound:%d of %d (%2.2f%%)\n", atbound, m_dim, ((
float64_t) 100.0*atbound)/m_dim);
626 for (int32_t i=0; i<
m_dim; i++)
629 for (int32_t t=0; t<2000; t++)
631 for (int32_t i=0; i<
m_dim; i++)
639 for (int32_t i=0; i<
m_dim; i++)
641 if (x[i]==0.0 || x[i]==1.0)
644 SG_PRINT(
"atbound:%d of %d (%2.2f%%)\n", atbound, m_dim, ((
float64_t) 100.0*atbound)/m_dim);
666 for (int32_t i=0; i<
m_dim; i++)