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.
int DSDPDualMatCholeskyBackwardMultiply(DSDPDualMat S, SDPConeVec B, SDPConeVec X)
Multiply by triangular matrix.
int DSDPDualMatCholeskyForwardMultiply(DSDPDualMat S, SDPConeVec B, SDPConeVec X)
Multiply by triangular matrix.
int DSDPDualMatCholeskySolveBackward(DSDPDualMat S, SDPConeVec B, SDPConeVec X)
Backward triangular solve.
int DSDPDualMatCholeskySolveForward(DSDPDualMat S, SDPConeVec B, SDPConeVec X)
Forward triangular solve.
int DSDPDualMatIsFull(DSDPDualMat S, DSDPTruth *full)
Factor the matrix.
int DSDPDualMatSetArray(DSDPDualMat S, DSDPVMat T)
Print the matrix.
int DSDPDualMatInvert(DSDPDualMat S)
Invert the matrix.
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 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