Example #1
0
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);
}
Example #2
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 */