/* * Initializes the solver. * * This function assumes that the KKT matrix K is already in the form * * [0 A' G'] * K = [A 0 0 ] * [G 0 -I ] * * The preprocessor/codegen takes care of this, we just have to be aware * of this implicit assumption. */ idxint init(pwork* w) { idxint i, KKT_FACTOR_RETURN_CODE; idxint* Pinv = w->KKT->Pinv; #if PROFILING > 1 timer tfactor, tkktsolve; #endif w->KKT->delta = w->stgs->delta; /* Factor KKT matrix - this is needed in all 3 linear system solves */ #if PROFILING > 1 tic(&tfactor); KKT_FACTOR_RETURN_CODE = kkt_factor(w->KKT, w->stgs->eps, w->stgs->delta, &w->info->tfactor_t1, &w->info->tfactor_t2); w->info->tfactor += toc(&tfactor); #else KKT_FACTOR_RETURN_CODE = kkt_factor(w->KKT, w->stgs->eps, w->stgs->delta); #endif /* check if factorization was successful, exit otherwise */ if( KKT_FACTOR_RETURN_CODE != KKT_OK ){ #if PRINTLEVEL > 0 if( w->stgs->verbose ) PRINTTEXT("\nProblem in factoring KKT system, aborting."); #endif return ECOS_FATAL; } /* * PRIMAL VARIABLES: * - solve xhat = arg min ||Gx-h||_2^2 such that Ax = b * - r = h - G*xhat * These two equations are solved by * * [ 0 A' G' ] [ xhat ] [ 0 ] * [ A 0 0 ] [ y ] = [ b ] * [ G 0 -I ] [ -r ] [ h ] * * and then take shat = r if alphap < 0, zbar + (1+alphap)*e otherwise * where alphap = inf{ alpha | sbar + alpha*e >= 0 } */ /* Solve for RHS [0; b; h] */ #if PROFILING > 1 tic(&tkktsolve); #endif w->info->nitref1 = kkt_solve(w->KKT, w->A, w->G, w->KKT->RHS1, w->KKT->dx1, w->KKT->dy1, w->KKT->dz1, w->n, w->p, w->m, w->C, 1, w->stgs->nitref); #if PROFILING > 1 w->info->tkktsolve += toc(&tkktsolve); #endif #if DEBUG > 0 #if PRINTLEVEL > 3 printDenseMatrix(w->KKT->dx1, w->n, 1, "dx1_init"); printDenseMatrix(w->KKT->dy1, w->p, 1, "dy1_init"); printDenseMatrix(w->KKT->dz1, w->m, 1, "dz1_init"); #endif #endif /* Copy out initial value of x */ for( i=0; i<w->n; i++ ){ w->x[i] = w->KKT->dx1[i]; } /* Copy out -r into temporary variable */ for( i=0; i<w->m; i++ ){ w->KKT->work1[i] = -w->KKT->dz1[i]; } /* Bring variable to cone */ bring2cone(w->C, w->KKT->work1, w->s ); /* * dual variables * solve (yhat,zbar) = arg min ||z||_2^2 such that G'*z + A'*y + c = 0 * * we can solve this by * * [ 0 A' G' ] [ x ] [ -c ] * [ A 0 0 ] [ yhat ] = [ 0 ] * [ G 0 -I ] [ zbar ] [ 0 ] * * and then take zhat = zbar if alphad < 0, zbar + (1+alphad)*e otherwise * where alphad = inf{ alpha | zbar + alpha*e >= 0 } */ /* Solve for RHS [-c; 0; 0] */ #if PROFILING > 1 tic(&tkktsolve); #endif w->info->nitref2 = kkt_solve(w->KKT, w->A, w->G, w->KKT->RHS2, w->KKT->dx2, w->KKT->dy2, w->KKT->dz2, w->n, w->p, w->m, w->C, 1, w->stgs->nitref); #if PROFILING > 1 w->info->tkktsolve += toc(&tkktsolve); #endif #if DEBUG > 0 #if PRINTLEVEL > 3 printDenseMatrix(w->KKT->dx2, w->n, 1, "dx2_init"); printDenseMatrix(w->KKT->dy2, w->p, 1, "dy2_init"); printDenseMatrix(w->KKT->dz2, w->m, 1, "dz2_init"); #endif #endif /* Copy out initial value of y */ for( i=0; i<w->p; i++ ){ w->y[i] = w->KKT->dy2[i]; } /* Bring variable to cone */ bring2cone(w->C, w->KKT->dz2, w->z ); /* Prepare RHS1 - before this line RHS1 = [0; b; h], after it holds [-c; b; h] */ for( i=0; i<w->n; i++){ w->KKT->RHS1[Pinv[i]] = -w->c[i]; } /* * other variables */ w->kap = 1.0; w->tau = 1.0; w->info->step = 0; w->info->step_aff = 0; w->info->dinf = 0; w->info->pinf = 0; return 0; }
/* * Initializes the solver. */ idxint init(pwork* w) { idxint i, j, k, l, KKT_FACTOR_RETURN_CODE; idxint* Pinv = w->KKT->Pinv; pfloat rx, ry, rz; #if PROFILING > 1 timer tfactor, tkktsolve; #endif /* set regularization parameter */ w->KKT->delta = w->stgs->delta; /* Initialize KKT matrix */ kkt_init(w->KKT->PKPt, w->KKT->PK, w->C); #if DEBUG > 0 dumpSparseMatrix(w->KKT->PKPt, "PKPt0.txt"); #endif /* initialize RHS1 */ k = 0; j = 0; for( i=0; i<w->n; i++ ){ w->KKT->RHS1[w->KKT->Pinv[k++]] = 0; } for( i=0; i<w->p; i++ ){ w->KKT->RHS1[w->KKT->Pinv[k++]] = w->b[i]; } for( i=0; i<w->C->lpc->p; i++ ){ w->KKT->RHS1[w->KKT->Pinv[k++]] = w->h[i]; j++; } for( l=0; l<w->C->nsoc; l++ ){ for( i=0; i < w->C->soc[l].p; i++ ){ w->KKT->RHS1[w->KKT->Pinv[k++]] = w->h[j++]; } #if CONEMODE == 0 w->KKT->RHS1[w->KKT->Pinv[k++]] = 0; w->KKT->RHS1[w->KKT->Pinv[k++]] = 0; #endif } #if PRINTLEVEL > 2 PRINTTEXT("Written %d entries of RHS1\n", (int)k); #endif /* initialize RHS2 */ for( i=0; i<w->n; i++ ){ w->KKT->RHS2[w->KKT->Pinv[i]] = -w->c[i]; } for( i=w->n; i<w->KKT->PKPt->n; i++ ){ w->KKT->RHS2[w->KKT->Pinv[i]] = 0; } /* get scalings of problem data */ rx = norm2(w->c, w->n); w->resx0 = MAX(1, rx); ry = norm2(w->b, w->p); w->resy0 = MAX(1, ry); rz = norm2(w->h, w->m); w->resz0 = MAX(1, rz); /* Factor KKT matrix - this is needed in all 3 linear system solves */ #if PROFILING > 1 tic(&tfactor); KKT_FACTOR_RETURN_CODE = kkt_factor(w->KKT, w->stgs->eps, w->stgs->delta, &w->info->tfactor_t1, &w->info->tfactor_t2); w->info->tfactor += toc(&tfactor); #else KKT_FACTOR_RETURN_CODE = kkt_factor(w->KKT, w->stgs->eps, w->stgs->delta); #endif /* check if factorization was successful, exit otherwise */ if( KKT_FACTOR_RETURN_CODE != KKT_OK ){ #if PRINTLEVEL > 0 if( w->stgs->verbose ) PRINTTEXT("\nProblem in factoring KKT system, aborting."); #endif return ECOS_FATAL; } /* * PRIMAL VARIABLES: * - solve xhat = arg min ||Gx-h||_2^2 such that Ax = b * - r = h - G*xhat * These two equations are solved by * * [ 0 A' G' ] [ xhat ] [ 0 ] * [ A 0 0 ] [ y ] = [ b ] * [ G 0 -I ] [ -r ] [ h ] * * and then take shat = r if alphap < 0, zbar + (1+alphap)*e otherwise * where alphap = inf{ alpha | sbar + alpha*e >= 0 } */ /* Solve for RHS [0; b; h] */ #if PROFILING > 1 tic(&tkktsolve); #endif w->info->nitref1 = kkt_solve(w->KKT, w->A, w->G, w->KKT->RHS1, w->KKT->dx1, w->KKT->dy1, w->KKT->dz1, w->n, w->p, w->m, w->C, 1, w->stgs->nitref); #if PROFILING > 1 w->info->tkktsolve += toc(&tkktsolve); #endif #if DEBUG > 0 #if PRINTLEVEL > 3 printDenseMatrix(w->KKT->dx1, w->n, 1, "dx1_init"); printDenseMatrix(w->KKT->dy1, w->p, 1, "dy1_init"); printDenseMatrix(w->KKT->dz1, w->m, 1, "dz1_init"); #endif #endif /* Copy out initial value of x */ for( i=0; i<w->n; i++ ){ w->x[i] = w->KKT->dx1[i]; } /* Copy out -r into temporary variable */ for( i=0; i<w->m; i++ ){ w->KKT->work1[i] = -w->KKT->dz1[i]; } /* Bring variable to cone */ bring2cone(w->C, w->KKT->work1, w->s ); /* * dual variables * solve (yhat,zbar) = arg min ||z||_2^2 such that G'*z + A'*y + c = 0 * * we can solve this by * * [ 0 A' G' ] [ x ] [ -c ] * [ A 0 0 ] [ yhat ] = [ 0 ] * [ G 0 -I ] [ zbar ] [ 0 ] * * and then take zhat = zbar if alphad < 0, zbar + (1+alphad)*e otherwise * where alphad = inf{ alpha | zbar + alpha*e >= 0 } */ /* Solve for RHS [-c; 0; 0] */ #if PROFILING > 1 tic(&tkktsolve); #endif w->info->nitref2 = kkt_solve(w->KKT, w->A, w->G, w->KKT->RHS2, w->KKT->dx2, w->KKT->dy2, w->KKT->dz2, w->n, w->p, w->m, w->C, 1, w->stgs->nitref); #if PROFILING > 1 w->info->tkktsolve += toc(&tkktsolve); #endif #if DEBUG > 0 #if PRINTLEVEL > 3 printDenseMatrix(w->KKT->dx2, w->n, 1, "dx2_init"); printDenseMatrix(w->KKT->dy2, w->p, 1, "dy2_init"); printDenseMatrix(w->KKT->dz2, w->m, 1, "dz2_init"); #endif #endif /* Copy out initial value of y */ for( i=0; i<w->p; i++ ){ w->y[i] = w->KKT->dy2[i]; } /* Bring variable to cone */ bring2cone(w->C, w->KKT->dz2, w->z ); /* Prepare RHS1 - before this line RHS1 = [0; b; h], after it holds [-c; b; h] */ for( i=0; i<w->n; i++){ w->KKT->RHS1[Pinv[i]] = -w->c[i]; } /* * other variables */ w->kap = 1.0; w->tau = 1.0; w->info->step = 0; w->info->step_aff = 0; w->info->dinf = 0; w->info->pinf = 0; return 0; }