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"
18int 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"
42int 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"
75int 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"
111int 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"
140int 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"
191int 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"
223int 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"
251int 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"
292int 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"
325int 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 SDPConeCheckJ(SDPCone sdpcone, int blockj)
Check validity of parameter.
Definition: dsdpadddata.c:31
int SDPConeCheckN(SDPCone sdpcone, int blockj, int n)
Check validity of parameter.
Definition: dsdpadddata.c:48
int SDPConeCheckM(SDPCone sdpcone, int m)
Check validity of parameter.
Definition: dsdpadddata.c:68
DSDPTruth
Boolean variables.
@ DSDP_FALSE
@ DSDP_TRUE
int DSDPBlockASum(DSDPBlockData *ADATA, double aa, DSDPVec Yk, DSDPVMat XX)
Sum the data matrices.
Definition: dsdpblock.c:20
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 DSDPBlockADot(DSDPBlockData *ADATA, double aa, DSDPVec Alpha, DSDPVMat X, DSDPVec AX)
Compute inner product of XX with data matrices.
Definition: dsdpblock.c:49
int DSDPDualMatCholeskyFactor(DSDPDualMat S, DSDPTruth *psdefinite)
Factor the matrix.
Definition: dsdpdualmat.c:320
int DSDPDualMatCholeskyBackwardMultiply(DSDPDualMat S, SDPConeVec B, SDPConeVec X)
Multiply by triangular matrix.
Definition: dsdpdualmat.c:373
int DSDPDualMatCholeskyForwardMultiply(DSDPDualMat S, SDPConeVec B, SDPConeVec X)
Multiply by triangular matrix.
Definition: dsdpdualmat.c:346
int DSDPDualMatCholeskySolveBackward(DSDPDualMat S, SDPConeVec B, SDPConeVec X)
Backward triangular solve.
Definition: dsdpdualmat.c:295
int DSDPDualMatCholeskySolveForward(DSDPDualMat S, SDPConeVec B, SDPConeVec X)
Forward triangular solve.
Definition: dsdpdualmat.c:267
int DSDPDualMatIsFull(DSDPDualMat S, DSDPTruth *full)
Factor the matrix.
Definition: dsdpdualmat.c:397
int DSDPDualMatSetArray(DSDPDualMat S, DSDPVMat T)
Print the matrix.
Definition: dsdpdualmat.c:160
int DSDPDualMatInvert(DSDPDualMat S)
Invert the matrix.
Definition: dsdpdualmat.c:186
Internal SDPCone data structures and routines.
int DSDPMakeVMatWithArray(char, double[], int, int, DSDPVMat *)
Allocate V matrix using the given array.
Definition: sdpsss.c:381
int SDPConeComputeXX(SDPCone, int, DSDPVec, double, DSDPDualMat, DSDPVMat)
Compute X.
Definition: sdpcompute.c:235
Error handling, printing, and profiling.
struct DSDPVec_C DSDPVec
This object hold m+2 variables: a scaling of C, the y variables, and r.
Definition: dsdpvec.h:25
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
int DSDPVMatZeroEntries(DSDPVMat X)
Zero matrix.
Definition: dsdpxmat.c:125
int DSDPVMatDestroy(DSDPVMat *X)
Deallocate matrix.
Definition: dsdpxmat.c:86
int DSDPVMatScaleDiagonal(DSDPVMat X, double dscale)
Scaling diagonal is useful for inner products and norms.
Definition: dsdpxmat.c:147
int DSDPVMatView(DSDPVMat X)
Print matrix.
Definition: dsdpxmat.c:107
int SDPConeViewX(SDPCone sdpcone, int blockj, int n, double x[], int nn)
Print a dense array X to the screen.
Definition: sdpcone.c:223
int SDPConeGetStorageFormat(SDPCone sdpcone, int blockj, char *format)
Get the storage format for the block.
Definition: dsdpadddata.c:505
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 SDPConeComputeXV(SDPCone sdpcone, int blockj, int *derror)
Compute a factor V such that .
Definition: sdpcone.c:325
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
int SDPConeComputeX(SDPCone sdpcone, int blockj, int n, double x[], int nn)
Compute the matrix X.
Definition: sdpcone.c:191
int SDPConeAddXVAV(SDPCone sdpcone, int blockj, double vin[], int n, double sum[], int mm)
Compute for i = 0 through m.
Definition: sdpcone.c:292
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 SDPConeGetBlockSize(SDPCone sdpcone, int blockj, int *n)
Get the dimension of one block in the semidefinite cone.
Definition: dsdpadddata.c:560
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 SDPConeComputeSS(SDPCone sdpcone, int blockj, DSDPVec Y, DSDPVMat SS)
Sum the data matrices.
Definition: sdpcone.c:18
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 SDPConeVecScale(double alpha, SDPConeVec VV)
Compute the Euclidean norm.
Definition: sdpconevec.c:161
Represents an S matrix for one block in the semidefinite cone.
Definition: dsdpdualmat.h:18
Dense symmetric matrix for one block in the semidefinite cone.
Definition: dsdpxmat.h:17
Vector whose length corresponds to dimension of a block in a cone.
Definition: sdpconevec.h:13
Internal structure for semidefinite cone.
Definition: dsdpsdp.h:80
Internal structure for block of semidefinite cone.
Definition: dsdpsdp.h:52