40 SG_SDEBUG(
"terminating optimizer - %s\n", error_text);
61 for (int32_t i=0; i<n; i++)
63 for (int32_t j=0; j<n; j++)
68 int result=clapack_dpotrf(CblasRowMajor, CblasUpper, (
int) n, a2, (
int) n);
70 for (int32_t i=0; i<n; i++)
73 for (int32_t i=0; i<n; i++)
75 for (int32_t j=i+1; j<n; j++)
82 SG_SDEBUG(
"Choldc failed, matrix not positive definite\n");
91 void nrerror(
char error_text[]);
95 for (i = 0; i < n; i++)
97 for (j = i; j < n; j++)
101 for (k=i-1; k>=0; k--)
102 sum -= a[n*i + k]*a[n*j + k];
108 SG_SDEBUG(
"Choldc failed, matrix not positive definite");
117 a[n*j + i] = sum/p[i];
131 for (i=0; i<n; i++) {
133 for (k=i-1; k>=0; k--) sum -= a[n*i + k]*x[k];
137 for (i=n-1; i>=0; i--) {
139 for (k=i+1; k<n; k++) sum -= a[n*k + i]*x[k];
155 for (i=0; i<n; i++) {
157 for (k=i-1; k>=0; k--) sum -= a[n*i + k]*x[k];
168 for (i=n-1; i>=0; i--) {
170 for (k=i+1; k<n; k++) sum -= a[n*k + i]*x[k];
229 h_y[m*i + j] += t_a[n*j + k] * t_a[n*i + k];
237 for (i=0; i<m; i++) {
240 t_y[i] += t_a[i*n + j] * t_c[j];
243 cholsb(h_y, m, p_y, t_y, x_y);
245 for (i=0; i<n; i++) {
248 t_c[i] += t_a[j*n + i] * x_y[j];
267 for (i=0; i<n; i++) {
268 y[i] = m[(n+1) * i] * x[i];
271 y[i] += m[i + n*j] * x[j];
273 for (j=i+1; j<n; j++)
274 y[i] += m[n*i + j] * x[j];
396 for (i=0; i<n; i++) c_plus_1 += c[i];
399 for (i=0; i<n; i++) diag_h_x[i] = h_x[(n+1)*i];
404 for (i=0; i<n; i++) {
411 for (i=0; i<n; i++) {
412 sigma[i] = c[i] + h_dot_x[i];
414 sigma[i] -= a[n*j + i] * y[j];
418 z[i] = sigma[i] + bound;
421 s[i] = bound - sigma[i];
429 h_y[i*m + j] = (i==j) ? 1 : 0;
431 for (i=0; i<n; i++) {
440 solve_reduced(n, m, h_x, h_y, a, x, y, c_x, c_y, workspace,
444 for (i=0; i<n; i++) {
452 for (i=0, mu=0; i<n; i++)
453 mu += z[i] * g[i] + s[i] * t[i];
458 SG_SDEBUG(
"counter | pri_inf | dual_inf | pri_obj | dual_obj | ");
460 SG_SDEBUG(
"-------------------------------------------------------");
461 SG_SDEBUG(
"---------------------------\n");
469 h_x[(n+1) * i] = diag_h_x[i];
473 for (i=0; i<m; i++) {
476 rho[i] -= a[n*i + j] * x[j];
479 for (i=0; i<n; i++) {
480 nu[i] = l[i] - x[i] + g[i];
481 tau[i] = u[i] - x[i] - t[i];
483 sigma[i] = c[i] - z[i] + s[i] + h_dot_x[i];
485 sigma[i] -= a[n*j + i] * y[j];
496 for (i=0; i<n; i++) {
497 x_h_x += h_dot_x[i] * x[i];
504 primal_inf = sqrt(primal_inf)/b_plus_1;
505 dual_inf = sqrt(dual_inf)/c_plus_1;
507 primal_obj = 0.5 * x_h_x;
508 dual_obj = -0.5 * x_h_x;
509 for (i=0; i<n; i++) {
510 primal_obj += c[i] * x[i];
511 dual_obj += l[i] * z[i] - u[i] * s[i];
514 dual_obj += b[i] * y[i];
538 if ((verb >=
FLOOD) | ((verb ==
STATUS) & (status != 0)))
539 SG_SDEBUG(
"%7i | %.2e | %.2e | % .2e | % .2e | %6.3f | %.4f | %.2e\n",
540 counter, primal_inf, dual_inf, primal_obj, dual_obj,
549 for (i=0; i<n; i++) {
550 hat_nu[i] = nu[i] + g[i] * gamma_z[i] / z[i];
551 hat_tau[i] = tau[i] - t[i] * gamma_s[i] / s[i];
553 d[i] = z[i] / g[i] + s[i] / t[i];
557 for (i=0; i<n; i++) {
558 h_x[(n+1)*i] = diag_h_x[i] + d[i];
559 c_x[i] = sigma[i] - z[i] * hat_nu[i] / g[i] -
560 s[i] * hat_tau[i] / t[i];
562 for (i=0; i<m; i++) {
569 if (!
solve_reduced(n, m, h_x, h_y, a, delta_x, delta_y, c_x, c_y, workspace,
PREDICTOR))
575 for (i=0; i<n; i++) {
577 delta_s[i] = s[i] * (delta_x[i] - hat_tau[i]) / t[i];
578 delta_z[i] = z[i] * (hat_nu[i] - delta_x[i]) / g[i];
580 delta_g[i] = g[i] * (gamma_z[i] - delta_z[i]) / z[i];
581 delta_t[i] = t[i] * (gamma_s[i] - delta_s[i]) / s[i];
584 gamma_z[i] = mu / g[i] - z[i] - delta_z[i] * delta_g[i] / g[i];
585 gamma_s[i] = mu / t[i] - s[i] - delta_s[i] * delta_t[i] / t[i];
588 hat_nu[i] = nu[i] + g[i] * gamma_z[i] / z[i];
589 hat_tau[i] = tau[i] - t[i] * gamma_s[i] / s[i];
592 c_x[i] = sigma[i] - z[i] * hat_nu[i] / g[i] - s[i] * hat_tau[i] / t[i];
595 for (i=0; i<m; i++) {
602 solve_reduced(n, m, h_x, h_y, a, delta_x, delta_y, c_x, c_y, workspace,
605 for (i=0; i<n; i++) {
607 delta_s[i] = s[i] * (delta_x[i] - hat_tau[i]) / t[i];
608 delta_z[i] = z[i] * (hat_nu[i] - delta_x[i]) / g[i];
610 delta_g[i] = g[i] * (gamma_z[i] - delta_z[i]) / z[i];
611 delta_t[i] = t[i] * (gamma_s[i] - delta_s[i]) / s[i];
615 for (i=0; i<n; i++) {
621 alfa = (margin - 1) / alfa;
624 for (i=0, mu=0; i<n; i++)
625 mu += z[i] * g[i] + s[i] * t[i];
627 mu = mu *
CMath::sq((alfa - 1) / (alfa + 10));
629 for (i=0; i<n; i++) {
630 x[i] += alfa * delta_x[i];
631 g[i] += alfa * delta_g[i];
632 t[i] += alfa * delta_t[i];
633 z[i] += alfa * delta_z[i];
634 s[i] += alfa * delta_s[i];
638 y[i] += alfa * delta_y[i];
643 if ((status == 1) && (verb >=
STATUS)) {
644 SG_SDEBUG(
"----------------------------------------------------------------------------------\n");