DSDP
sdpcone.c
Go to the documentation of this file.
1 #include "dsdpsdp.h"
2 #include "dsdpsys.h"
8 #undef __FUNCT__
9 #define __FUNCT__ "SDPConeComputeSS"
10 
18 int SDPConeComputeSS(SDPCone sdpcone, int blockj, DSDPVec Y, DSDPVMat SS){
19  int info;
20  DSDPFunctionBegin;
21  info=DSDPVMatZeroEntries(SS); DSDPCHKBLOCKERR(blockj,info);
22  info=DSDPBlockASum(&sdpcone->blk[blockj].ADATA,1,Y,SS); DSDPCHKBLOCKERR(blockj,info);
23  DSDPFunctionReturn(0);
24 }
25 
26 #undef __FUNCT__
27 #define __FUNCT__ "SDPConeComputeS"
28 
42 int SDPConeComputeS(SDPCone sdpcone, int blockj, double cc,double y[], int nvars, double r, int n, double s[], int nn){
43  int i,info;
44  char UPLQ;
45  DSDPVMat T;
46  DSDPVec Y=sdpcone->Work;
47  DSDPFunctionBegin;
48  info=SDPConeCheckN(sdpcone,blockj,n);DSDPCHKBLOCKERR(blockj,info);
49  info=SDPConeCheckM(sdpcone,nvars);DSDPCHKERR(info);
50  if (n<1){DSDPFunctionReturn(0);}
51  info=DSDPVecSetC(Y,-1.0*cc);
52  info=DSDPVecSetR(Y,-r);
53  for (i=0;i<nvars;i++){info=DSDPVecSetElement(Y,i+1,y[i]);}
54  info=SDPConeGetStorageFormat(sdpcone,blockj,&UPLQ);DSDPCHKBLOCKERR(blockj,info);
55  info=DSDPMakeVMatWithArray(UPLQ,s,nn,n,&T);DSDPCHKBLOCKERR(blockj,info);
56  info=SDPConeComputeSS(sdpcone,blockj,Y,T);DSDPCHKBLOCKERR(blockj,info);
57  info=DSDPVMatDestroy(&T);DSDPCHKBLOCKERR(blockj,info);
58  DSDPFunctionReturn(0);
59 }
60 
61 #undef __FUNCT__
62 #define __FUNCT__ "SDPConeAddADotX"
63 
75 int SDPConeAddADotX(SDPCone sdpcone, int blockj, double alpha,double x[], int nn, double adotx[], int m){
76  int info,n;
77  char UPLQ;
78  SDPblk *blk=sdpcone->blk;
79  double scl=blk[blockj].ADATA.scl;
80  DSDPVec ADOTX,YW2;
81  DSDPVMat T;
82  DSDPFunctionBegin;
83  info=SDPConeCheckJ(sdpcone,blockj);DSDPCHKERR(info);
84  info=SDPConeCheckM(sdpcone,m-2);DSDPCHKERR(info);
85  YW2=sdpcone->Work2;
86  info=DSDPVecSet(alpha,YW2);DSDPCHKBLOCKERR(blockj,info);
87  info=SDPConeGetBlockSize(sdpcone,blockj,&n);DSDPCHKBLOCKERR(blockj,info);
88  if (n<1){DSDPFunctionReturn(0);}
89  info=DSDPVecCreateWArray(&ADOTX,adotx,m);
90  info=SDPConeGetStorageFormat(sdpcone,blockj,&UPLQ);DSDPCHKBLOCKERR(blockj,info);
91  info=DSDPMakeVMatWithArray(UPLQ,x,nn,n,&T);DSDPCHKBLOCKERR(blockj,info);
92  info=DSDPBlockADot(&blk[blockj].ADATA,1.0/scl,YW2,T,ADOTX);DSDPCHKBLOCKERR(blockj,info);
93  info=DSDPVMatDestroy(&T);DSDPCHKBLOCKERR(blockj,info);
94  DSDPFunctionReturn(0);
95 }
96 
97 #undef __FUNCT__
98 #define __FUNCT__ "SDPConeComputeXDot"
99 
111 int SDPConeComputeXDot(SDPCone sdpcone, int blockj, DSDPVec Y,DSDPVMat X, DSDPVec AX, double* xtrace,double *xnorm, double *tracexs){
112  int info;
113  SDPblk *blk=sdpcone->blk;
114  DSDPVec YW2=sdpcone->Work2;
115  double one=1.0,scl=blk[blockj].ADATA.scl;
116  DSDPFunctionBegin;
117  info=DSDPVecZero(YW2);DSDPCHKBLOCKERR(blockj,info);
118  info=DSDPBlockADot(&blk[blockj].ADATA,-1.0/scl,Y,X,YW2);DSDPCHKBLOCKERR(blockj,info);
119  info=DSDPVecGetR(YW2,xtrace);DSDPCHKBLOCKERR(blockj,info);
120  info=DSDPVecSum(YW2,tracexs);DSDPCHKBLOCKERR(blockj,info);
121  info=DSDPVMatNormF2(X,xnorm);DSDPCHKBLOCKERR(blockj,info);
122  info=DSDPVecSet(one,YW2);DSDPCHKBLOCKERR(blockj,info);
123  info=DSDPBlockADot(&blk[blockj].ADATA,1.0/scl,YW2,X,AX);DSDPCHKBLOCKERR(blockj,info);
124  DSDPFunctionReturn(0);
125 }
126 
127 #undef __FUNCT__
128 #define __FUNCT__ "SDPConeComputeX3"
129 
140 int SDPConeComputeX3(SDPCone sdpcone, int blockj, double mu, DSDPVec Y,DSDPVec DY,DSDPVMat X){
141  int info;
142  double xshift=1e-12,xscale=1e-12;
143  SDPblk *blk=sdpcone->blk;
144  DSDPTruth psdefinite1=DSDP_FALSE,psdefinite2=DSDP_FALSE,full;
145  DSDPDualMat SS;
146 
147  DSDPFunctionBegin;
148  SS=blk[blockj].SS;
149  info=SDPConeComputeSS(sdpcone,blockj,Y,X);DSDPCHKBLOCKERR(blockj,info);
150  info=DSDPDualMatSetArray(SS,X); DSDPCHKBLOCKERR(blockj,info);
151  info=DSDPDualMatCholeskyFactor(SS,&psdefinite1); DSDPCHKBLOCKERR(blockj,info);
152  if (psdefinite1 == DSDP_FALSE){
153  DSDPLogInfo(0,2,"Primal SDP Block %2.0f not PSD\n",blockj);
154  }
155  info=DSDPDualMatInvert(SS);DSDPCHKBLOCKERR(blockj,info);
156  info=SDPConeComputeXX(sdpcone,blockj,DY,mu,SS,X);DSDPCHKBLOCKERR(blockj,info);
157  info=DSDPDualMatIsFull(SS,&full);DSDPCHKBLOCKERR(blockj,info);
158  psdefinite2=DSDP_FALSE;
159  while (full==DSDP_TRUE && psdefinite2==DSDP_FALSE && xscale<2e-1){
160  info=DSDPVMatShiftDiagonal(X,xshift); DSDPCHKBLOCKERR(blockj,info);
161  info=DSDPVMatScaleDiagonal(X,1.0+xscale); DSDPCHKBLOCKERR(blockj,info);
162  DSDPLogInfo(0,10,"VMat: shift diagonal: %4.2e, scale diagonal: %4.2e.\n",xshift,1+xscale);
163  info=DSDPDualMatSetArray(SS,X); DSDPCHKBLOCKERR(blockj,info);
164  info=DSDPDualMatCholeskyFactor(SS,&psdefinite2); DSDPCHKBLOCKERR(blockj,info);
165  xshift*=10;xscale*=10;
166  }
167  if (full==DSDP_FALSE){
168  xshift=1e-12,xscale=1e-10;
169  info=DSDPVMatShiftDiagonal(X,xshift); DSDPCHKBLOCKERR(blockj,info);
170  info=DSDPVMatScaleDiagonal(X,1.0+xscale); DSDPCHKBLOCKERR(blockj,info);
171  DSDPLogInfo(0,10,"XMat: shift diagonal: %4.2e, scale diagonal: %4.2e.\n",xshift,1+xscale);
172  }
173  DSDPFunctionReturn(0);
174 }
175 
176 
177 #undef __FUNCT__
178 #define __FUNCT__ "SDPConeComputeX"
179 
191 int SDPConeComputeX(SDPCone sdpcone, int blockj, int n, double x[], int nn){
192  int info;
193  double mu=sdpcone->xmakermu;
194  double xnorm,xtrace,trxs;
195  char UPLQ;
196  DSDPVec DY=sdpcone->DYX,Y=sdpcone->YX,AX=sdpcone->Work;
197  DSDPVMat T;
198 
199  DSDPFunctionBegin;
200  info=SDPConeCheckN(sdpcone,blockj,n);DSDPCHKBLOCKERR(blockj,info);
201  if (n<1){DSDPFunctionReturn(0);}
202  info=SDPConeGetStorageFormat(sdpcone,blockj,&UPLQ);DSDPCHKBLOCKERR(blockj,info);
203  info=DSDPMakeVMatWithArray(UPLQ,x,nn,n,&T);DSDPCHKBLOCKERR(blockj,info);
204  info=SDPConeComputeX3(sdpcone,blockj,mu,Y,DY,T);DSDPCHKBLOCKERR(blockj,info);
205  info=SDPConeComputeXDot(sdpcone,blockj,Y,T,AX,&xtrace,&xnorm,&trxs);DSDPCHKBLOCKERR(blockj,info);
206  info=DSDPVMatDestroy(&T);DSDPCHKBLOCKERR(blockj,info);
207  DSDPFunctionReturn(0);
208 }
209 
210 #undef __FUNCT__
211 #define __FUNCT__ "SDPConeViewX"
212 
223 int SDPConeViewX(SDPCone sdpcone, int blockj, int n, double x[], int nn){
224  int info;
225  char UPLQ;
226  DSDPVMat T;
227 
228  DSDPFunctionBegin;
229  info=SDPConeCheckN(sdpcone,blockj,n);DSDPCHKBLOCKERR(blockj,info);
230  info=SDPConeGetStorageFormat(sdpcone,blockj,&UPLQ);DSDPCHKBLOCKERR(blockj,info);
231  info=DSDPMakeVMatWithArray(UPLQ,x,nn,n,&T);DSDPCHKBLOCKERR(blockj,info);
232  info=DSDPVMatView(T);DSDPCHKBLOCKERR(blockj,info);
233  info=DSDPVMatDestroy(&T);DSDPCHKBLOCKERR(blockj,info);
234  DSDPFunctionReturn(0);
235 }
236 
237 #undef __FUNCT__
238 #define __FUNCT__ "SDPConeXVMultiply"
239 
251 int SDPConeXVMultiply(SDPCone sdpcone, int blockj, double vin[], double vout[], int n){
252  int info;
253  SDPblk *blk=sdpcone->blk;
254  SDPConeVec V1,V2,V3,V4;
255  DSDPDualMat S,SS;
256 
257  DSDPFunctionBegin;
258  info=SDPConeCheckN(sdpcone,blockj,n);DSDPCHKBLOCKERR(blockj,info);
259  if (sdpcone->blk[blockj].n>1){
260  S=blk[blockj].S; SS=blk[blockj].SS;
261  V2=blk[blockj].W; V3=blk[blockj].W2;
262  info=SDPConeVecCreateWArray(&V1,vin,n);
263  info=SDPConeVecCreateWArray(&V4,vout,n);
264  if (0){
265  info=DSDPDualMatCholeskySolveForward(S,V1,V3);DSDPCHKERR(info);
266  info=SDPConeVecScale(sqrt(sdpcone->xmakermu),V3);DSDPCHKERR(info);
267  info=DSDPDualMatCholeskySolveBackward(S,V3,V2);DSDPCHKERR(info);
268  info=DSDPDualMatCholeskyBackwardMultiply(SS,V2,V1);DSDPCHKERR(info);
269  }
270  info=DSDPDualMatCholeskyForwardMultiply(SS,V1,V2);DSDPCHKERR(info);
271  info=DSDPDualMatCholeskySolveForward(S,V2,V3);DSDPCHKERR(info);
272  info=SDPConeVecScale(sqrt(sdpcone->xmakermu),V3);DSDPCHKERR(info);
273  info=DSDPDualMatCholeskySolveBackward(S,V3,V4);DSDPCHKERR(info);
274  }
275  DSDPFunctionReturn(0);
276 }
277 
278 #undef __FUNCT__
279 #define __FUNCT__ "SDPConeAddXVAV"
280 
292 int SDPConeAddXVAV(SDPCone sdpcone, int blockj, double vin[], int n, double sum[], int mm){
293  int info;
294  SDPblk *blk=sdpcone->blk;
295  SDPConeVec V2;
296  DSDPVec W,Wout;
297  DSDPFunctionBegin;
298  info=SDPConeCheckN(sdpcone,blockj,n);DSDPCHKBLOCKERR(blockj,info);
299  W=sdpcone->Work;
300  info=DSDPVecSet(1.0,sdpcone->Work);DSDPCHKBLOCKERR(blockj,info);
301  if (sdpcone->blk[blockj].n>1){
302  info=SDPConeVecCreateWArray(&V2,vin,n);DSDPCHKERR(info);
303  info=DSDPVecCreateWArray(&Wout,sum,mm);DSDPCHKERR(info);
304  info=DSDPBlockvAv(&blk[blockj].ADATA,1.0,sdpcone->Work,V2,Wout);DSDPCHKBLOCKERR(blockj,info);
305  }
306  DSDPFunctionReturn(0);
307 }
308 
309 
310 
311 #undef __FUNCT__
312 #define __FUNCT__ "SDPConeComputeXV"
313 
325 int SDPConeComputeXV(SDPCone sdpcone, int blockj, int *derror){
326 
327  int info; double rr;
328  DSDPVec Y,DY,W;
329  SDPblk *blk=sdpcone->blk;
330  DSDPTruth psdefinite1=DSDP_FALSE,psdefinite2=DSDP_FALSE;
331  DSDPDualMat S,SS;
332  DSDPVMat T;
333 
334  DSDPFunctionBegin;
335  *derror=0;
336  info=SDPConeCheckJ(sdpcone,blockj);DSDPCHKBLOCKERR(blockj,info);
337  if (sdpcone->blk[blockj].n>1){
338  Y=sdpcone->YX; DY=sdpcone->DYX; W=sdpcone->Work;
339  T=blk[blockj].T; S=blk[blockj].S; SS=blk[blockj].SS;
340  info=DSDPVecWAXPY(W,-1.0,DY,Y);DSDPCHKBLOCKERR(blockj,info);
341 
342  while (psdefinite1==DSDP_FALSE){
343  info=DSDPVecGetR(W,&rr);
344  info=DSDPVecSetR(W,10*rr-1e-12);
345  info=SDPConeComputeSS(sdpcone,blockj,W,T);DSDPCHKBLOCKERR(blockj,info);
346  info=DSDPDualMatSetArray(SS,T); DSDPCHKBLOCKERR(blockj,info);
347  info=DSDPDualMatCholeskyFactor(SS,&psdefinite1); DSDPCHKBLOCKERR(blockj,info);
348  }
349 
350  while (psdefinite2==DSDP_FALSE){
351  info=SDPConeComputeSS(sdpcone,blockj,Y,T);DSDPCHKBLOCKERR(blockj,info);
352  info=DSDPDualMatSetArray(S,T); DSDPCHKBLOCKERR(blockj,info);
353  info=DSDPDualMatCholeskyFactor(S,&psdefinite2); DSDPCHKBLOCKERR(blockj,info);
354  if (psdefinite2==DSDP_FALSE){
355  info=DSDPVecGetR(Y,&rr);
356  info=DSDPVecSetR(Y,10*rr-1e-15);
357  }
358  }
359  if (psdefinite1==DSDP_FALSE || psdefinite2==DSDP_FALSE) *derror=1;
360  }
361  DSDPFunctionReturn(0);
362 }
int SDPConeComputeXX(SDPCone, int, DSDPVec, double, DSDPDualMat, DSDPVMat)
Compute X.
Definition: sdpcompute.c:235
int DSDPDualMatIsFull(DSDPDualMat S, DSDPTruth *full)
Factor the matrix.
Definition: dsdpdualmat.c:397
DSDPTruth
Boolean variables.
int SDPConeVecScale(double alpha, SDPConeVec VV)
Compute the Euclidean norm.
Definition: sdpconevec.c:161
struct DSDPVec_C DSDPVec
This object hold m+2 variables: a scaling of C, the y variables, and r.
Definition: dsdpvec.h:25
int DSDPBlockASum(DSDPBlockData *ADATA, double aa, DSDPVec Yk, DSDPVMat XX)
Sum the data matrices.
Definition: dsdpblock.c:20
int DSDPMakeVMatWithArray(char, double[], int, int, DSDPVMat *)
Allocate V matrix using the given array.
Definition: sdpsss.c:381
Error handling, printing, and profiling.
int SDPConeGetBlockSize(SDPCone sdpcone, int blockj, int *n)
Get the dimension of one block in the semidefinite cone.
Definition: dsdpadddata.c:560
int SDPConeComputeX(SDPCone sdpcone, int blockj, int n, double x[], int nn)
Compute the matrix X.
Definition: sdpcone.c:191
int DSDPVMatScaleDiagonal(DSDPVMat X, double dscale)
Scaling diagonal is useful for inner products and norms.
Definition: dsdpxmat.c:147
int DSDPDualMatCholeskySolveBackward(DSDPDualMat S, SDPConeVec B, SDPConeVec X)
Backward triangular solve.
Definition: dsdpdualmat.c:295
int DSDPBlockvAv(DSDPBlockData *ADATA, double aa, DSDPVec Alpha, SDPConeVec V, DSDPVec VAV)
Set VAV[i] to aa * Alpha[i] * V' A[i] V.
Definition: dsdpblock.c:84
int SDPConeCheckM(SDPCone sdpcone, int m)
Check validity of parameter.
Definition: dsdpadddata.c:68
int DSDPBlockADot(DSDPBlockData *ADATA, double aa, DSDPVec Alpha, DSDPVMat X, DSDPVec AX)
Compute inner product of XX with data matrices.
Definition: dsdpblock.c:49
int SDPConeAddXVAV(SDPCone sdpcone, int blockj, double vin[], int n, double sum[], int mm)
Compute for i = 0 through m.
Definition: sdpcone.c:292
Vector whose length corresponds to dimension of a block in a cone.
Definition: sdpconevec.h:13
int SDPConeAddADotX(SDPCone sdpcone, int blockj, double alpha, double x[], int nn, double adotx[], int m)
Compute the inner products of a dense matrix X with the data matrices.
Definition: sdpcone.c:75
int DSDPDualMatCholeskyBackwardMultiply(DSDPDualMat S, SDPConeVec B, SDPConeVec X)
Multiply by triangular matrix.
Definition: dsdpdualmat.c:373
int DSDPDualMatCholeskySolveForward(DSDPDualMat S, SDPConeVec B, SDPConeVec X)
Forward triangular solve.
Definition: dsdpdualmat.c:267
int DSDPVMatDestroy(DSDPVMat *X)
Deallocate matrix.
Definition: dsdpxmat.c:86
Internal structure for block of semidefinite cone.
Definition: dsdpsdp.h:52
int SDPConeComputeSS(SDPCone sdpcone, int blockj, DSDPVec Y, DSDPVMat SS)
Sum the data matrices.
Definition: sdpcone.c:18
int DSDPDualMatInvert(DSDPDualMat S)
Invert the matrix.
Definition: dsdpdualmat.c:186
int SDPConeComputeXV(SDPCone sdpcone, int blockj, int *derror)
Compute a factor V such that .
Definition: sdpcone.c:325
int DSDPDualMatCholeskyFactor(DSDPDualMat S, DSDPTruth *psdefinite)
Factor the matrix.
Definition: dsdpdualmat.c:320
int SDPConeCheckJ(SDPCone sdpcone, int blockj)
Check validity of parameter.
Definition: dsdpadddata.c:31
Represents an S matrix for one block in the semidefinite cone.
Definition: dsdpdualmat.h:18
int DSDPDualMatCholeskyForwardMultiply(DSDPDualMat S, SDPConeVec B, SDPConeVec X)
Multiply by triangular matrix.
Definition: dsdpdualmat.c:346
int DSDPDualMatSetArray(DSDPDualMat S, DSDPVMat T)
Print the matrix.
Definition: dsdpdualmat.c:160
int DSDPVMatZeroEntries(DSDPVMat X)
Zero matrix.
Definition: dsdpxmat.c:125
int SDPConeXVMultiply(SDPCone sdpcone, int blockj, double vin[], double vout[], int n)
Multiply an array by a factor V such that .
Definition: sdpcone.c:251
Internal structure for semidefinite cone.
Definition: dsdpsdp.h:80
int SDPConeGetStorageFormat(SDPCone sdpcone, int blockj, char *format)
Get the storage format for the block.
Definition: dsdpadddata.c:505
int SDPConeCheckN(SDPCone sdpcone, int blockj, int n)
Check validity of parameter.
Definition: dsdpadddata.c:48
int SDPConeComputeX3(SDPCone sdpcone, int blockj, double mu, DSDPVec Y, DSDPVec DY, DSDPVMat X)
Compute the matrix X with the given information.
Definition: sdpcone.c:140
int SDPConeComputeS(SDPCone sdpcone, int blockj, double cc, double y[], int nvars, double r, int n, double s[], int nn)
Compute the dual matrix S.
Definition: sdpcone.c:42
int DSDPVMatView(DSDPVMat X)
Print matrix.
Definition: dsdpxmat.c:107
Dense symmetric matrix for one block in the semidefinite cone.
Definition: dsdpxmat.h:17
int DSDPVMatNormF2(DSDPVMat X, double *normf2)
Compute square of Frobenius norm of matrix.
Definition: dsdpxmat.c:186
int DSDPVMatShiftDiagonal(DSDPVMat X, double dadd)
Add something to diagonal elements.
Definition: dsdpxmat.c:166
Internal SDPCone data structures and routines.
int SDPConeComputeXDot(SDPCone sdpcone, int blockj, DSDPVec Y, DSDPVMat X, DSDPVec AX, double *xtrace, double *xnorm, double *tracexs)
Compute inner product of X with the Data, S, and norm of X.
Definition: sdpcone.c:111
int SDPConeViewX(SDPCone sdpcone, int blockj, int n, double x[], int nn)
Print a dense array X to the screen.
Definition: sdpcone.c:223