static int DSDPLinearSolverPrepare(void* ctx,int*flag){ cfc_sta Cfact; chfac *sf; MCholSolverALL *AMA = (MCholSolverALL *)ctx; DSDPFunctionBegin; *flag=0; sf=AMA->M; /* Cfact=(cfc_sta)ChlFact(sf,sf->iw,sf->rw,FALSE); */ Cfact=(cfc_sta)ChlFact(sf,sf->iw,sf->rw,TRUE); if (CfcOk!=Cfact ){ *flag=1; /* printf("Not Good factorization \n"); */ } DSDPFunctionReturn(0); }
void GetLhat(sdpdat *sdt) { int i,j,k,n,itmp=0; double lamda,dl,rtmp,*q,*y,*dy,*uv; chfac *cf,*mf; array *cj,*sj; symat *cy; syoff *st; n=sdt->nrow; if ( sdt->ptyp!=UquCut) { sdt->mf=NULL; CfcFree(&sdat->mf); SyoFree(&sdat->st); /* Reassign L factor for rank reduction */ sdt->mf=sdt->mf=CfcAlloc(n,"mf, GetLhat"); copyChl(sdt->sf,sdt->mf); } lamda=sdt->lamda; dl =sdt->dl; cf =sdt->sf; mf =sdt->mf; y =sdt->y; dy =sdt->dy; q =sdt->rw; uv =sdt->rw+5*n; cy =sdt->cy; st =sdt->st; /* * find L such that LL^T=S+Diag(dy)+dl*e*e^T */ if (sdt->ptyp==UquCut) { rtmp=dl-lamda; for (j=0; j<n; j++) mf->diag[j]=cy->diag[j]+(dy[j]-y[j])+rtmp; for (j=0; j<n; j++) { for (i=j+1; i<n; i++) q[i]=rtmp; cj=cy->roff+j; for (k=0; k<cj->nn0; k++) q[cj->ja[k]]+=cj->an[k]; sj=st->roff+j; for (k=0; k<sj->nn0; k++) sj->an[k]=q[sj->ja[k]]; } } else { for (j=0; j<n; j++) { mf->diag[mf->invp[j]]=cy->diag[j]+(dy[j]-y[j]); } dCopy(sdt->sf->unnz,uv,mf->uval); if (sdt->ptyp==DvdCut) { rtmp=dl-lamda; mf->diag[mf->invp[sdt->is]]+=rtmp; mf->diag[mf->invp[sdt->it]]+=rtmp; mf->uval[mf->upst] +=rtmp; } } /* If return is not 0 */ if( sdt->ptyp != EquCut ) { if (CfcOk!=ChlFact(mf,sdt->iw,q,true)) { ExitProc(SysError,NULL); } } else ChlFact(mf,sdt->iw,q,false); mf->NegDiag =-1; if( sdt->ptyp == EquCut ) { for(j=0;j<n;j++) { if( mf->diag[mf->invp[j]]<0 ) /* Why invp? */ { if( mf->NegDiag <0 ) { mf->NegDiag = mf->invp[j]; itmp++; } else mf->NegDiag =-2; } } } if(mf->NegDiag<-1) { printf("\n Error in ecut rank reduction."); printf("\n More than one Negative number in diagonal."); printf("\n There are %d negitives.",itmp); ShutDown(); } } /* GetLhat */