static int Tdestroy(void*M){ MCholSolverALL *AMA = (MCholSolverALL *)M; int info; DSDPFunctionBegin; CfcFree(&AMA->M); info = DSDPVecDestroy(&AMA->D1); DSDPCHKERR(info); if (AMA->is_dense==0 && AMA->rnnz ){ DSDPFREE(&AMA->rnnz,&info);DSDPCHKERR(info); DSDPFREE(&AMA->colnnz,&info);DSDPCHKERR(info); } DSDPFREE(&AMA,&info);DSDPCHKERR(info); DSDPFunctionReturn(0); }
void ShutDown(void) { clock_t tim; double rtmp; rtmp=fabs(sdat->pobj-sdat->dobj)/(1.0+fabs(sdat->dobj)); if (rtmp>sdat->par.tolgap) { tim=GetTime()-stim[START]; #ifdef PCMACHINE printf(" time=%.2f\n\n",(double)tim/CLOCKS_PER_SEC); #else printf(" time=%.2f\n\n",(double)0.01*tim); #endif fclose(fout); } dFree(&sdat->y); dFree(&sdat->dy); dFree(&sdat->s); dFree(&sdat->sinv); SmtFree(&sdat->c); SymFree(&sdat->cy); SyoFree(&sdat->st); if (sdat->mf) sdat->mf->uval=NULL; CfcFree(&sdat->mf); CfcFree(&sdat->sf); dPtFree(&sdat->u); dPtFree(&sdat->v); iFree(&sdat->iw); dFree(&sdat->rw); } /* ShutDown */
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 */