50 if (gettimeofday(&tv, NULL)==0)
51 return tv.tv_sec+((
float64_t)(tv.tv_usec))/1e6;
74 int (*add_pw_constr)(uint32_t, uint32_t,
void*),
75 void (*clip_neg_W)(uint32_t, uint32_t*,
void*),
78 int (*add_new_cut)(
float64_t*, uint32_t*, uint32_t, uint32_t,
void*),
79 int (*compute_output)(
float64_t*,
void* ),
81 void (*ocas_print)(ocas_return_value_T),
84 ocas_return_value_T ocas={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
87 float64_t xi, sq_norm_W, QPSolverTolRel, dot_prod_WoldW, sq_norm_oldW;
88 float64_t A0, B0, GradVal, t, t1, t2, *Ci, *Bi, *hpf, *hpb;
94 libqp_state_T qp_exitflag;
102 ocas.qp_solver_time = 0;
103 ocas.output_time = 0;
111 QPSolverTolRel = TolRel*0.5;
150 new_cut = (uint32_t*)LIBOCAS_CALLOC(nData,
sizeof(uint32_t));
157 I = (uint32_t*)LIBOCAS_CALLOC(BufSize,
sizeof(uint32_t));
164 for(i=0; i<
BufSize; i++) I[i] = 2;
181 if(old_output == NULL)
188 hpf = (
float64_t*) LIBOCAS_CALLOC(nData,
sizeof(hpf[0]));
195 hpb = (
float64_t*) LIBOCAS_CALLOC(nData,
sizeof(hpb[0]));
222 for(i=0; i < num_nnw; i++)
224 if(add_pw_constr(nnw_idx[i],i, user_data) != 0)
230 H[LIBOCAS_INDEX(i,i,BufSize)] = 1.0;
238 ocas.nCutPlanes = num_nnw;
245 ocas.Q_P = 0.5*sq_norm_W + C*xi;
250 for(i=0; i < nData; i++)
253 ocas.trn_err = nData;
254 ocas.ocas_time =
get_time() - ocas_start_time;
261 while( ocas.exitflag == 0 )
266 b[ocas.nCutPlanes] = -(
float64_t)cut_length;
268 max_b = LIBOCAS_MAX(max_b,(
float64_t)cut_length);
272 if(add_new_cut( &
H[LIBOCAS_INDEX(0,ocas.nCutPlanes,BufSize)], new_cut, cut_length, ocas.nCutPlanes, user_data ) != 0)
278 ocas.add_time +=
get_time() - start_time;
281 diag_H[ocas.nCutPlanes] =
H[LIBOCAS_INDEX(ocas.nCutPlanes,ocas.nCutPlanes,BufSize)];
282 for(i=0; i < ocas.nCutPlanes; i++) {
283 H[LIBOCAS_INDEX(ocas.nCutPlanes,i,BufSize)] =
H[LIBOCAS_INDEX(i,ocas.nCutPlanes,BufSize)];
286 max_cp_norm = LIBOCAS_MAX(max_cp_norm, sqrt(diag_H[ocas.nCutPlanes]));
295 _C[0] = sqrt((
float64_t)nData)*(sqrt(C)*sqrt(max_b) + C*max_cp_norm);
300 ocas.nCutPlanes,
QPSolverMaxIter, 0.0, QPSolverTolRel, -LIBOCAS_PLUS_INF,0);
302 ocas.qp_exitflag = qp_exitflag.exitflag;
304 ocas.qp_solver_time +=
get_time() - start_time;
305 ocas.Q_D = -qp_exitflag.QP;
308 for(i=0; i < ocas.nCutPlanes; i++) {
309 if( alpha[i] != 0) ocas.nNZAlpha++;
312 sq_norm_oldW = sq_norm_W;
314 compute_W( &sq_norm_W, &dot_prod_WoldW, alpha, ocas.nCutPlanes, user_data );
315 clip_neg_W(num_nnw, nnw_idx, user_data);
316 ocas.w_time +=
get_time() - start_time;
325 if( compute_output( output, user_data ) != 0)
330 ocas.output_time +=
get_time()-start_time;
335 for(i=0; i < nData; i++)
337 if(output[i] <= 0) ocas.trn_err++;
341 new_cut[cut_length] = i;
345 ocas.Q_P = 0.5*sq_norm_W + C*xi;
347 ocas.ocas_time =
get_time() - ocas_start_time;
356 ocas.print_time +=
get_time() - start_time;
365 A0 = sq_norm_W -2*dot_prod_WoldW + sq_norm_oldW;
366 B0 = dot_prod_WoldW - sq_norm_oldW;
368 memcpy( old_output, output,
sizeof(
float64_t)*nData );
371 if( compute_output( output, user_data ) != 0)
376 ocas.output_time +=
get_time()-start_time;
380 for(i=0; i< nData; i++) {
382 Ci[i] = C*(1-old_output[i]);
383 Bi[i] = C*(old_output[i] - output[i]);
389 val = -LIBOCAS_PLUS_INF;
399 if( (Bi[i] < 0 && val > 0) || (Bi[i] > 0 && val <= 0))
409 if( sort(hpf, hpb, num_hp) != 0 )
414 ocas.sort_time +=
get_time() - start_time;
418 while( GradVal < 0 && i < num_hp )
421 GradVal_new = GradVal + LIBOCAS_ABS(hpb[i]) + A0*(t_new-t);
423 if( GradVal_new >= 0 )
425 t = t + GradVal*(t-t_new)/(GradVal_new - GradVal);
433 GradVal = GradVal_new;
448 t = LIBOCAS_MAX(t,0);
451 t = LIBOCAS_MIN(t,1);
458 sq_norm_W = update_W( t1, user_data );
464 for(i=0; i < nData; i++ ) {
466 if( (old_output[i]*(1-t2) + t2*output[i]) <= 1 )
468 new_cut[cut_length] = i;
472 output[i] = old_output[i]*(1-t1) + t1*output[i];
474 if( output[i] <= 1) xi += 1-output[i];
475 if( output[i] <= 0) ocas.trn_err++;
479 ocas.Q_P = 0.5*sq_norm_W + C*xi;
481 ocas.ocas_time =
get_time() - ocas_start_time;
490 ocas.print_time +=
get_time() - start_time;
496 if( ocas.Q_P - ocas.Q_D <= TolRel*LIBOCAS_ABS(ocas.Q_P)) ocas.exitflag = 1;
497 if( ocas.Q_P - ocas.Q_D <= TolAbs) ocas.exitflag = 2;
498 if( ocas.Q_P <= QPBound) ocas.exitflag = 3;
499 if( MaxTime > 0 && ocas.ocas_time >= MaxTime) ocas.exitflag = 4;
500 if(ocas.nCutPlanes >= BufSize) ocas.exitflag = -1;
509 LIBOCAS_FREE(new_cut);
511 LIBOCAS_FREE(diag_H);
512 LIBOCAS_FREE(output);
513 LIBOCAS_FREE(old_output);
520 ocas.ocas_time =
get_time() - ocas_start_time;
541 int (*add_new_cut)(
float64_t*, uint32_t*, uint32_t, uint32_t,
void*),
542 int (*compute_output)(
float64_t*,
void* ),
544 void (*ocas_print)(ocas_return_value_T),
547 ocas_return_value_T ocas={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
550 float64_t xi, sq_norm_W, QPSolverTolRel, dot_prod_WoldW, sq_norm_oldW;
551 float64_t A0, B0, GradVal, t, t1, t2, *Ci, *Bi, *hpf, *hpb;
554 uint32_t i, *new_cut;
557 libqp_state_T qp_exitflag;
560 ocas.qp_solver_time = 0;
561 ocas.output_time = 0;
570 QPSolverTolRel = TolRel*0.5;
609 new_cut = (uint32_t*)LIBOCAS_CALLOC(nData,
sizeof(uint32_t));
616 I = (uint32_t*)LIBOCAS_CALLOC(BufSize,
sizeof(uint32_t));
623 for(i=0; i<
BufSize; i++) I[i] = 1;
640 if(old_output == NULL)
647 hpf = (
float64_t*) LIBOCAS_CALLOC(nData,
sizeof(hpf[0]));
654 hpb = (
float64_t*) LIBOCAS_CALLOC(nData,
sizeof(hpb[0]));
683 ocas.Q_P = 0.5*sq_norm_W + C*xi;
688 for(i=0; i < nData; i++)
694 ocas.trn_err = nData;
695 ocas.ocas_time =
get_time() - ocas_start_time;
702 while( ocas.exitflag == 0 )
707 b[ocas.nCutPlanes] = -(
float64_t)cut_length;
711 if(add_new_cut( &
H[LIBOCAS_INDEX(0,ocas.nCutPlanes,BufSize)], new_cut, cut_length, ocas.nCutPlanes, user_data ) != 0)
717 ocas.add_time +=
get_time() - start_time;
720 diag_H[ocas.nCutPlanes] =
H[LIBOCAS_INDEX(ocas.nCutPlanes,ocas.nCutPlanes,BufSize)];
721 for(i=0; i < ocas.nCutPlanes; i++) {
722 H[LIBOCAS_INDEX(ocas.nCutPlanes,i,BufSize)] =
H[LIBOCAS_INDEX(i,ocas.nCutPlanes,BufSize)];
731 ocas.nCutPlanes,
QPSolverMaxIter, 0.0, QPSolverTolRel, -LIBOCAS_PLUS_INF,0);
733 ocas.qp_exitflag = qp_exitflag.exitflag;
735 ocas.qp_solver_time +=
get_time() - start_time;
736 ocas.Q_D = -qp_exitflag.QP;
739 for(i=0; i < ocas.nCutPlanes; i++) {
740 if( alpha[i] != 0) ocas.nNZAlpha++;
743 sq_norm_oldW = sq_norm_W;
745 compute_W( &sq_norm_W, &dot_prod_WoldW, alpha, ocas.nCutPlanes, user_data );
746 ocas.w_time +=
get_time() - start_time;
755 if( compute_output( output, user_data ) != 0)
760 ocas.output_time +=
get_time()-start_time;
767 for(i=0; i < nData; i++)
769 if(output[i] <= 0) ocas.trn_err++;
773 new_cut[cut_length] = i;
777 ocas.Q_P = 0.5*sq_norm_W + C*xi;
779 ocas.ocas_time =
get_time() - ocas_start_time;
788 ocas.print_time +=
get_time() - start_time;
797 A0 = sq_norm_W -2*dot_prod_WoldW + sq_norm_oldW;
798 B0 = dot_prod_WoldW - sq_norm_oldW;
800 memcpy( old_output, output,
sizeof(
float64_t)*nData );
803 if( compute_output( output, user_data ) != 0)
808 ocas.output_time +=
get_time()-start_time;
812 for(i=0; i< nData; i++) {
814 Ci[i] = C*(1-old_output[i]);
815 Bi[i] = C*(old_output[i] - output[i]);
821 val = -LIBOCAS_PLUS_INF;
831 if( (Bi[i] < 0 && val > 0) || (Bi[i] > 0 && val <= 0))
841 if( sort(hpf, hpb, num_hp) != 0 )
846 ocas.sort_time +=
get_time() - start_time;
850 while( GradVal < 0 && i < num_hp )
853 GradVal_new = GradVal + LIBOCAS_ABS(hpb[i]) + A0*(t_new-t);
855 if( GradVal_new >= 0 )
857 t = t + GradVal*(t-t_new)/(GradVal_new - GradVal);
865 GradVal = GradVal_new;
880 t = LIBOCAS_MAX(t,0);
887 sq_norm_W = update_W( t1, user_data );
893 for(i=0; i < nData; i++ ) {
895 if( (old_output[i]*(1-t2) + t2*output[i]) <= 1 )
897 new_cut[cut_length] = i;
901 output[i] = old_output[i]*(1-t1) + t1*output[i];
903 if( output[i] <= 1) xi += 1-output[i];
904 if( output[i] <= 0) ocas.trn_err++;
908 ocas.Q_P = 0.5*sq_norm_W + C*xi;
910 ocas.ocas_time =
get_time() - ocas_start_time;
919 ocas.print_time +=
get_time() - start_time;
925 if( ocas.Q_P - ocas.Q_D <= TolRel*LIBOCAS_ABS(ocas.Q_P)) ocas.exitflag = 1;
926 if( ocas.Q_P - ocas.Q_D <= TolAbs) ocas.exitflag = 2;
927 if( ocas.Q_P <= QPBound) ocas.exitflag = 3;
928 if( MaxTime > 0 && ocas.ocas_time >= MaxTime) ocas.exitflag = 4;
929 if(ocas.nCutPlanes >= BufSize) ocas.exitflag = -1;
938 LIBOCAS_FREE(new_cut);
940 LIBOCAS_FREE(diag_H);
941 LIBOCAS_FREE(output);
942 LIBOCAS_FREE(old_output);
949 ocas.ocas_time =
get_time() - ocas_start_time;
970 int (*add_new_cut)(
float64_t*, uint32_t*, uint32_t, uint32_t,
void*),
971 int (*compute_output)(
float64_t*,
void* ),
973 void (*ocas_print)(ocas_return_value_T),
976 ocas_return_value_T ocas={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
979 float64_t xi, sq_norm_W, QPSolverTolRel, dot_prod_WoldW, sq_norm_oldW;
980 float64_t A0, B0, GradVal, t, t1, t2, *Ci, *Bi, *hpf, *hpb;
985 uint32_t i, *new_cut;
988 libqp_state_T qp_exitflag;
991 ocas.qp_solver_time = 0;
992 ocas.output_time = 0;
1000 QPSolverTolRel = TolRel*0.5;
1039 new_cut = (uint32_t*)LIBOCAS_CALLOC(nData,
sizeof(uint32_t));
1046 I = (uint32_t*)LIBOCAS_CALLOC(BufSize,
sizeof(uint32_t));
1053 for(i=0; i<
BufSize; i++) I[i] = 1;
1070 if(old_output == NULL)
1077 hpf = (
float64_t*) LIBOCAS_CALLOC(nData,
sizeof(hpf[0]));
1084 hpb = (
float64_t*) LIBOCAS_CALLOC(nData,
sizeof(hpb[0]));
1106 ocas.nCutPlanes = 0;
1119 for(i=0; i < nData; i++)
1125 ocas.Q_P = 0.5*sq_norm_W + new_b;
1128 ocas.trn_err = nData;
1129 ocas.ocas_time =
get_time() - ocas_start_time;
1136 while( ocas.exitflag == 0 )
1142 b[ocas.nCutPlanes] = -new_b;
1146 if(add_new_cut( &
H[LIBOCAS_INDEX(0,ocas.nCutPlanes,BufSize)], new_cut, cut_length, ocas.nCutPlanes, user_data ) != 0)
1152 ocas.add_time +=
get_time() - start_time;
1155 diag_H[ocas.nCutPlanes] =
H[LIBOCAS_INDEX(ocas.nCutPlanes,ocas.nCutPlanes,BufSize)];
1156 for(i=0; i < ocas.nCutPlanes; i++) {
1157 H[LIBOCAS_INDEX(ocas.nCutPlanes,i,BufSize)] =
H[LIBOCAS_INDEX(i,ocas.nCutPlanes,BufSize)];
1168 ocas.nCutPlanes,
QPSolverMaxIter, 0.0, QPSolverTolRel, -LIBOCAS_PLUS_INF,0);
1170 ocas.qp_exitflag = qp_exitflag.exitflag;
1172 ocas.qp_solver_time +=
get_time() - start_time;
1173 ocas.Q_D = -qp_exitflag.QP;
1176 for(i=0; i < ocas.nCutPlanes; i++) {
1177 if( alpha[i] != 0) ocas.nNZAlpha++;
1180 sq_norm_oldW = sq_norm_W;
1182 compute_W( &sq_norm_W, &dot_prod_WoldW, alpha, ocas.nCutPlanes, user_data );
1183 ocas.w_time +=
get_time() - start_time;
1192 if( compute_output( output, user_data ) != 0)
1197 ocas.output_time +=
get_time()-start_time;
1203 for(i=0; i < nData; i++)
1205 if(output[i] <= 0) ocas.trn_err++;
1209 if(output[i] <= C[i]) {
1210 xi += C[i] - output[i];
1211 new_cut[cut_length] = i;
1217 ocas.Q_P = 0.5*sq_norm_W + xi;
1219 ocas.ocas_time =
get_time() - ocas_start_time;
1228 ocas.print_time +=
get_time() - start_time;
1237 A0 = sq_norm_W -2*dot_prod_WoldW + sq_norm_oldW;
1238 B0 = dot_prod_WoldW - sq_norm_oldW;
1240 memcpy( old_output, output,
sizeof(
float64_t)*nData );
1243 if( compute_output( output, user_data ) != 0)
1248 ocas.output_time +=
get_time()-start_time;
1250 uint32_t num_hp = 0;
1252 for(i=0; i< nData; i++) {
1256 Ci[i] = (C[i]-old_output[i]);
1257 Bi[i] = old_output[i] - output[i];
1263 val = -LIBOCAS_PLUS_INF;
1268 hpb[num_hp] = Bi[i];
1273 if( (Bi[i] < 0 && val > 0) || (Bi[i] > 0 && val <= 0))
1283 if( sort(hpf, hpb, num_hp) != 0 )
1288 ocas.sort_time +=
get_time() - start_time;
1292 while( GradVal < 0 && i < num_hp )
1295 GradVal_new = GradVal + LIBOCAS_ABS(hpb[i]) + A0*(t_new-t);
1297 if( GradVal_new >= 0 )
1299 t = t + GradVal*(t-t_new)/(GradVal_new - GradVal);
1307 GradVal = GradVal_new;
1322 t = LIBOCAS_MAX(t,0);
1329 sq_norm_W = update_W( t1, user_data );
1336 for(i=0; i < nData; i++ ) {
1339 if( (old_output[i]*(1-t2) + t2*output[i]) <= C[i] )
1341 new_cut[cut_length] = i;
1346 output[i] = old_output[i]*(1-t1) + t1*output[i];
1349 if( output[i] <= C[i]) xi += C[i]-output[i];
1350 if( output[i] <= 0) ocas.trn_err++;
1355 ocas.Q_P = 0.5*sq_norm_W + xi;
1357 ocas.ocas_time =
get_time() - ocas_start_time;
1366 ocas.print_time +=
get_time() - start_time;
1372 if( ocas.Q_P - ocas.Q_D <= TolRel*LIBOCAS_ABS(ocas.Q_P)) ocas.exitflag = 1;
1373 if( ocas.Q_P - ocas.Q_D <= TolAbs) ocas.exitflag = 2;
1374 if( ocas.Q_P <= QPBound) ocas.exitflag = 3;
1375 if( MaxTime > 0 && ocas.ocas_time >= MaxTime) ocas.exitflag = 4;
1376 if(ocas.nCutPlanes >= BufSize) ocas.exitflag = -1;
1384 LIBOCAS_FREE(alpha);
1385 LIBOCAS_FREE(new_cut);
1387 LIBOCAS_FREE(diag_H);
1388 LIBOCAS_FREE(output);
1389 LIBOCAS_FREE(old_output);
1396 ocas.ocas_time =
get_time() - ocas_start_time;
1415 uint32_t i, j, idx, idx2 = 0, start;
1422 while( i < (uint32_t)n-1 && A[i] == A[i+1])
1424 if( B[i+1] > B[idx] )
1433 SortedA[0] = A[idx];
1438 while( start < (uint32_t)n && A[idx] == A[start])
1441 theta = LIBOCAS_PLUS_INF;
1442 for(j=start; j < (uint32_t)n; j++)
1444 tmp = (B[j] - B[idx])/(A[idx]-A[j]);
1452 if( theta < LIBOCAS_PLUS_INF)
1454 Theta[(*nSortedA) - 1] = theta;
1455 SortedA[(*nSortedA)] = A[idx2];
1481 int (*add_new_cut)(
float64_t*, uint32_t*, uint32_t,
void*),
1482 int (*compute_output)(
float64_t*,
void* ),
1484 void (*ocas_print)(ocas_return_value_T),
1487 ocas_return_value_T ocas={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
1490 float64_t xi, sq_norm_W, QPSolverTolRel, QPSolverTolAbs, dot_prod_WoldW, sq_norm_oldW;
1491 float64_t A0, B0, t, t1, t2, R, tmp, element_b, x;
1492 float64_t *A, *B, *theta, *Theta, *sortedA, *Add;
1493 float64_t start_time, ocas_start_time, grad_sum, grad, min_x = 0, old_x, old_grad;
1494 uint32_t i, y, y2, ypred = 0, *new_cut, cnt1, cnt2, j, nSortedA, idx;
1497 libqp_state_T qp_exitflag;
1500 ocas.qp_solver_time = 0;
1501 ocas.output_time = 0;
1505 ocas.print_time = 0;
1509 QPSolverTolRel = TolRel*0.5;
1510 QPSolverTolAbs = TolAbs*0.5;
1551 new_cut = (uint32_t*)LIBOCAS_CALLOC(nData,
sizeof(uint32_t));
1558 I = (uint32_t*)LIBOCAS_CALLOC(BufSize,
sizeof(uint32_t));
1583 if(old_output == NULL)
1633 ocas.nCutPlanes = 0;
1637 ocas.trn_err = nData;
1641 ocas.Q_P = 0.5*sq_norm_W + C*R;
1644 for(i=0; i < nData; i++)
1646 y2 = (uint32_t)data_y[i];
1655 ocas.ocas_time =
get_time() - ocas_start_time;
1659 ocas.print_time +=
get_time() - start_time;
1662 while( ocas.exitflag == 0 )
1667 b[ocas.nCutPlanes] = -(
float64_t)element_b;
1671 if(add_new_cut( &
H[LIBOCAS_INDEX(0,ocas.nCutPlanes,BufSize)], new_cut, ocas.nCutPlanes, user_data ) != 0)
1677 ocas.add_time +=
get_time() - start_time;
1680 diag_H[ocas.nCutPlanes] =
H[LIBOCAS_INDEX(ocas.nCutPlanes,ocas.nCutPlanes,BufSize)];
1681 for(i=0; i < ocas.nCutPlanes; i++)
1683 H[LIBOCAS_INDEX(ocas.nCutPlanes,i,BufSize)] =
H[LIBOCAS_INDEX(i,ocas.nCutPlanes,BufSize)];
1692 ocas.nCutPlanes,
QPSolverMaxIter, QPSolverTolAbs, QPSolverTolRel, -LIBOCAS_PLUS_INF,0);
1694 ocas.qp_exitflag = qp_exitflag.exitflag;
1696 ocas.qp_solver_time +=
get_time() - start_time;
1697 ocas.Q_D = -qp_exitflag.QP;
1700 for(i=0; i < ocas.nCutPlanes; i++)
1701 if( alpha[i] != 0) ocas.nNZAlpha++;
1703 sq_norm_oldW = sq_norm_W;
1705 compute_W( &sq_norm_W, &dot_prod_WoldW, alpha, ocas.nCutPlanes, user_data );
1706 ocas.w_time +=
get_time() - start_time;
1715 if( compute_output( output, user_data ) != 0)
1720 ocas.output_time +=
get_time()-start_time;
1727 for(i=0; i < nData; i++)
1729 y2 = (uint32_t)data_y[i];
1731 for(xi=-LIBOCAS_PLUS_INF, y=0; y < nY; y++)
1733 if(y2 != y && xi < output[LIBOCAS_INDEX(y,i,nY)])
1735 xi = output[LIBOCAS_INDEX(y,i,nY)];
1740 if(xi >= output[LIBOCAS_INDEX(y2,i,nY)])
1743 xi = LIBOCAS_MAX(0,xi+1-output[LIBOCAS_INDEX(y2,i,nY)]);
1754 ocas.Q_P = 0.5*sq_norm_W + C*R;
1756 ocas.ocas_time =
get_time() - ocas_start_time;
1760 ocas.print_time +=
get_time() - start_time;
1766 memcpy( old_output, output,
sizeof(
float64_t)*nData*nY );
1769 if( compute_output( output, user_data ) != 0)
1774 ocas.output_time +=
get_time()-start_time;
1776 A0 = sq_norm_W - 2*dot_prod_WoldW + sq_norm_oldW;
1777 B0 = dot_prod_WoldW - sq_norm_oldW;
1779 for(i=0; i < nData; i++)
1781 y2 = (uint32_t)data_y[i];
1783 for(y=0; y < nY; y++)
1785 A[LIBOCAS_INDEX(y,i,nY)] = C*(output[LIBOCAS_INDEX(y,i,nY)] - old_output[LIBOCAS_INDEX(y,i,nY)]
1786 + old_output[LIBOCAS_INDEX(y2,i,nY)] - output[LIBOCAS_INDEX(y2,i,nY)]);
1787 B[LIBOCAS_INDEX(y,i,nY)] = C*(old_output[LIBOCAS_INDEX(y,i,nY)] - old_output[LIBOCAS_INDEX(y2,i,nY)]
1798 for(i=0; i < nData; i++)
1800 findactive(theta,sortedA,&nSortedA,&A[i*nY],&B[i*nY],nY,sort);
1803 while( idx < nSortedA-1 && theta[idx] < 0 )
1806 grad_sum += sortedA[idx];
1808 for(j=idx; j < nSortedA-1; j++)
1810 Theta[cnt1] = theta[j];
1814 for(j=idx+1; j < nSortedA; j++)
1816 Add[cnt2] = -sortedA[j-1]+sortedA[j];
1822 sort(Theta,Add,cnt1);
1823 ocas.sort_time +=
get_time() - start_time;
1835 for(i=0; i < cnt1; i++)
1839 grad = x*A0 + grad_sum;
1844 min_x = (grad*old_x - old_grad*x)/(grad - old_grad);
1850 grad_sum = grad_sum + Add[i];
1852 grad = x*A0 + grad_sum;
1872 sq_norm_W = update_W( t1, user_data );
1877 for(i=0; i < nData; i++)
1879 y2 = (uint32_t)data_y[i];
1881 for(xi=-LIBOCAS_PLUS_INF, y=0; y < nY; y++)
1883 tmp = old_output[LIBOCAS_INDEX(y,i,nY)]*(1-t2) + t2*output[LIBOCAS_INDEX(y,i,nY)];
1884 if(y2 != y && xi < tmp)
1891 tmp = old_output[LIBOCAS_INDEX(y2,i,nY)]*(1-t2) + t2*output[LIBOCAS_INDEX(y2,i,nY)];
1892 xi = LIBOCAS_MAX(0,xi+1-tmp);
1905 for(i=0; i < nData; i++)
1907 y2 = (uint32_t)data_y[i];
1909 for(tmp=-LIBOCAS_PLUS_INF, y=0; y < nY; y++)
1911 output[LIBOCAS_INDEX(y,i,nY)] = old_output[LIBOCAS_INDEX(y,i,nY)]*(1-t1) + t1*output[LIBOCAS_INDEX(y,i,nY)];
1913 if(y2 != y && tmp < output[LIBOCAS_INDEX(y,i,nY)])
1916 tmp = output[LIBOCAS_INDEX(y,i,nY)];
1920 R += LIBOCAS_MAX(0,1+tmp - output[LIBOCAS_INDEX(y2,i,nY)]);
1921 if( tmp >= output[LIBOCAS_INDEX(y2,i,nY)])
1925 ocas.Q_P = 0.5*sq_norm_W + C*R;
1929 ocas.ocas_time =
get_time() - ocas_start_time;
1933 ocas.print_time +=
get_time() - start_time;
1940 if( ocas.Q_P - ocas.Q_D <= TolRel*LIBOCAS_ABS(ocas.Q_P)) ocas.exitflag = 1;
1941 if( ocas.Q_P - ocas.Q_D <= TolAbs) ocas.exitflag = 2;
1942 if( ocas.Q_P <= QPBound) ocas.exitflag = 3;
1943 if( MaxTime > 0 && ocas.ocas_time >= MaxTime) ocas.exitflag = 4;
1944 if(ocas.nCutPlanes >= BufSize) ocas.exitflag = -1;
1952 LIBOCAS_FREE(alpha);
1953 LIBOCAS_FREE(new_cut);
1955 LIBOCAS_FREE(diag_H);
1956 LIBOCAS_FREE(output);
1957 LIBOCAS_FREE(old_output);
1960 LIBOCAS_FREE(theta);
1961 LIBOCAS_FREE(Theta);
1962 LIBOCAS_FREE(sortedA);
1965 ocas.ocas_time =
get_time() - ocas_start_time;