Beispiel #1
0
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 */