void sLinsysRootAug::finalizeKKT(sData* prob, Variables* vars) { assert(locmz==0||gOuterSolve<3); int j, p, pend; double val; stochNode->resMon.recFactTmLocal_start(); stochNode->resMon.recSchurMultLocal_start(); DenseSymMatrix * kktd = (DenseSymMatrix*) kkt; //alias for internal buffer of kkt double** dKkt = kktd->Mat(); ////////////////////////////////////////////////////// // compute Q+diag(xdiag) - C' * diag(zDiag) * C // and update the KKT ////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// // update the KKT with Q (DO NOT PUT DIAG) ///////////////////////////////////////////////////////////// SparseSymMatrix& Q = prob->getLocalQ(); int* krowQ=Q.krowM(); int* jcolQ=Q.jcolM(); double* dQ=Q.M(); for(int i=0; i<locnx; i++) { pend = krowQ[i+1]; for(p=krowQ[i]; p<pend; p++) { j = jcolQ[p]; if(i==j) continue; val = dQ[p]; dKkt[i][j] += val; dKkt[j][i] += val; } } ///////////////////////////////////////////////////////////// // update the KKT with the diagonals // xDiag is in fact diag(Q)+X^{-1}S ///////////////////////////////////////////////////////////// //kktd->atPutDiagonal( 0, *xDiag ); SimpleVector& sxDiag = dynamic_cast<SimpleVector&>(*xDiag); for(int i=0; i<locnx; i++) dKkt[i][i] += sxDiag[i]; SimpleVector& syDiag = dynamic_cast<SimpleVector&>(*yDiag); for(int i=locnx; i<locnx+locmy; i++) dKkt[i][i] += syDiag[i-locnx]; ///////////////////////////////////////////////////////////// // update the KKT with - C' * diag(zDiag) *C ///////////////////////////////////////////////////////////// if(locmz>0) { SparseGenMatrix& C = prob->getLocalD(); C.matTransDinvMultMat(*zDiag, &CtDC); assert(CtDC->size() == locnx); //aliases for internal buffers of CtDC SparseSymMatrix* CtDCsp = reinterpret_cast<SparseSymMatrix*>(CtDC); int* krowCtDC=CtDCsp->krowM(); int* jcolCtDC=CtDCsp->jcolM(); double* dCtDC=CtDCsp->M(); for(int i=0; i<locnx; i++) { pend = krowCtDC[i+1]; for(p=krowCtDC[i]; p<pend; p++) { j = jcolCtDC[p]; dKkt[i][j] -= dCtDC[p]; //printf("%d %d %f\n", i,j,dCtDC[p]); } } } //~end if locmz>0 ///////////////////////////////////////////////////////////// // update the KKT with A (symmetric update forced) ///////////////////////////////////////////////////////////// if(locmy>0){ kktd->symAtPutSubmatrix( locnx, 0, prob->getLocalB(), 0, 0, locmy, locnx, 1 ); } //prob->getLocalB().getStorageRef().dump("stage1eqmat2.dump"); ///////////////////////////////////////////////////////////// // update the KKT zeros for the lower right block ///////////////////////////////////////////////////////////// //kktd->storage().atPutZeros(locnx, locnx, locmy+locmz, locmy+locmz); //myAtPutZeros(kktd, locnx, locnx, locmy, locmy); stochNode->resMon.recSchurMultLocal_stop(); stochNode->resMon.recFactTmLocal_stop(); }