7 static int SDPConeOperationsInitialize(
struct DSDPCone_Ops*);
9 static int KSDPConeSetup(
void*,
DSDPVec);
11 static int KSDPConeSize(
void*,
double*);
12 static int KSDPConeSparsity(
void*,
int,
int[],
int[],
int);
16 static int KSDPConeComputeLogSDeterminant(
void *,
double *,
double*);
18 static int KSDPConeDestroy(
void*);
21 #define __FUNCT__ "KSDPConeComputeHessian" 27 DSDPFunctionReturn(0);
31 #define __FUNCT__ "KDPConeMultiply" 35 SDPConeValid(sdpcone);
37 for (kk=0; kk<sdpcone->nblocks; kk++){
38 info=
SDPConeMultiply(sdpcone,kk,mu,vrow,vin,vout);DSDPCHKBLOCKERR(kk,info);
40 DSDPFunctionReturn(0);
44 #define __FUNCT__ "KDPConeRHS " 49 SDPConeValid(sdpcone);
50 for (kk=0; kk<sdpcone->nblocks; kk++){
51 if (sdpcone->blk[kk].n<1)
continue;
54 DSDPFunctionReturn(0);
59 #define __FUNCT__ "KSDPConeSetup" 60 static int KSDPConeSetup(
void* K,
DSDPVec y){
64 SDPConeValid(sdpcone);
66 DSDPFunctionReturn(0);
70 #define __FUNCT__ "KSDPConeSetup2" 76 DSDPFunctionReturn(0);
81 #define __FUNCT__ "KSDPConeDestroy" 82 static int KSDPConeDestroy(
void* K){
86 SDPConeValid(sdpcone);
88 DSDPFunctionReturn(0);
93 #define __FUNCT__ "KSDPConeSize" 94 static int KSDPConeSize(
void* K,
double *n){
97 SDPConeValid(sdpcone);
99 DSDPFunctionReturn(0);
103 #define __FUNCT__ "KSDPConeSparsity" 104 static int KSDPConeSparsity(
void *K,
int row,
int *tnnz,
int rnnz[],
int m){
108 int nnzblocks=sdpcone->ATR.nnzblocks[row],*nzblocks=sdpcone->ATR.nzblocks[row];
110 SDPConeValid(sdpcone);
111 for (j=0; j<nnzblocks; j++){
113 if (blk[kk].n<1)
continue;
116 DSDPFunctionReturn(0);
120 #define __FUNCT__ "KSDPConeComputeSS" 130 for (kk=sdpcone->nblocks-1; kk>=0 && psdefinite ==
DSDP_TRUE; kk--){
131 if (blk[kk].n<1)
continue;
135 switch (sdpcone->optype){
142 DSDPLogInfo(0,2,
"Dual SDP Block %2.0f not PSD\n",kk);
144 DSDPLogInfo(0,2,
"Primal SDP Block %2.0f not PSD\n",kk);
150 *ispsdefinite=psdefinite;
152 info=DSDPVecCopy(Y,sdpcone->YY);DSDPCHKERR(info);
154 DSDPFunctionReturn(0);
158 #define __FUNCT__ "KSDPConeInvertSS" 159 static int KSDPConeInvertSS(
void *K){
165 SDPConeValid(sdpcone);
166 for (kk=0;kk<sdpcone->nblocks;kk++){
167 if (sdpcone->blk[kk].n<1)
continue;
168 SS=sdpcone->blk[kk].S;
171 DSDPFunctionReturn(0);
177 #define __FUNCT__ "KSDPConeComputeMaxStepLength" 180 double smaxstep,maxmaxstep=1.0e20;
188 SDPConeValid(sdpcone);
189 for (kk=0; kk<sdpcone->nblocks; kk++){
190 if (blk[kk].n<1)
continue;
193 DS=blk[kk].DS; T=blk[kk].T;
198 info=
DSDPLanczosStepSize( &blk[kk].Lanczos,blk[kk].W,blk[kk].W2,SS,DS,&smaxstep );DSDPCHKBLOCKERR(kk,info);
199 DSDPLogInfo(0,12,
"Block %d, PD %d, maxstepsize: %4.4e\n",kk,flag,smaxstep);
200 maxmaxstep=DSDPMin(smaxstep,maxmaxstep);
202 *maxsteplength=maxmaxstep;
203 DSDPFunctionReturn(0);
209 #define __FUNCT__ "KSDPConeAddANorm2" 210 static int KSDPConeAddANorm2(
void *K,
DSDPVec ANorm2){
216 SDPConeValid(sdpcone);
217 for (kk=0; kk<sdpcone->nblocks; kk++){
218 if (blk[kk].n<1)
continue;
219 info=DSDPBlockANorm2( &blk[kk].ADATA,ANorm2,blk[kk].n); DSDPCHKBLOCKERR(kk,info);
221 DSDPFunctionReturn(0);
227 #define __FUNCT__ "KSDPConeSetX" 228 static int KSDPConeSetX(
void *K,
double mu,
DSDPVec Y,
DSDPVec DY){
232 SDPConeValid(sdpcone);
233 info=DSDPVecCopy(Y,sdpcone->YX);DSDPCHKERR(info);
234 info=DSDPVecCopy(DY,sdpcone->DYX);DSDPCHKERR(info);
235 sdpcone->xmakermu=mu;
236 DSDPFunctionReturn(0);
241 #define __FUNCT__ "KSDPConeComputeXX" 246 double xnorm,trxs,xtrace;
250 SDPConeValid(sdpcone);
251 info=KSDPConeSetX(K,mu,Y,DY);DSDPCHKERR(info);
252 for (kk=0; kk<sdpcone->nblocks; kk++){
253 if (sdpcone->blk[kk].n<1)
continue;
254 X=sdpcone->blk[kk].T;
256 info=
SDPConeComputeXDot(sdpcone,kk,Y,X,AX,&xtrace,&xnorm,&trxs);DSDPCHKBLOCKERR(kk,info);
258 DSDPLogInfo(0,10,
"SDP Block %d: norm(X): %4.2e, trace(X): %4.2e, trace(XS): %4.2e.\n",kk,xnorm,xtrace,trxs);
260 DSDPFunctionReturn(0);
265 #define __FUNCT__ "KSDPConeComputeLogSDeterminant" 266 static int KSDPConeComputeLogSDeterminant(
void *K,
double *logdetobj,
double *logdet){
268 double dlogdet=0,dlogdet2=0,dd;
273 SDPConeValid(sdpcone);
274 for (kk=0; kk<sdpcone->nblocks; kk++){
275 if (blk[kk].n<1)
continue;
277 dlogdet+=dd*blk[kk].gammamu;
278 dlogdet2+=dd*blk[kk].bmu;
282 DSDPFunctionReturn(0);
287 #define __FUNCT__ "KSDPConeMonitor" 288 int KSDPConeMonitor(
void *K,
int tag){
290 DSDPFunctionReturn(0);
293 static struct DSDPCone_Ops kops;
294 static const char *sdpconename =
"SDP Cone";
297 #define __FUNCT__ "SDPConeOperationsInitialize" 298 static int SDPConeOperationsInitialize(
struct DSDPCone_Ops* coneops){
300 if (coneops==NULL)
return 0;
302 coneops->conehessian=KSDPConeComputeHessian;
303 coneops->conerhs=KSDPConeRHS;
304 coneops->conesetup=KSDPConeSetup;
305 coneops->conesetup2=KSDPConeSetup2;
306 coneops->conedestroy=KSDPConeDestroy;
307 coneops->conecomputes=KSDPConeComputeSS;
308 coneops->coneinverts=KSDPConeInvertSS;
309 coneops->conesetxmaker=KSDPConeSetX;
310 coneops->conecomputex=KSDPConeComputeXX;
311 coneops->conemaxsteplength=KSDPConeComputeMaxStepLength;
312 coneops->conelogpotential=KSDPConeComputeLogSDeterminant;
313 coneops->conesize=KSDPConeSize;
314 coneops->conesparsity=KSDPConeSparsity;
315 coneops->conehmultiplyadd=KSDPConeMultiply;
316 coneops->coneanorm2=KSDPConeAddANorm2;
317 coneops->conemonitor=KSDPConeMonitor;
319 coneops->name=sdpconename;
324 #define __FUNCT__ "DSDPAddSDP" 334 SDPConeValid(sdpcone);
335 info=SDPConeOperationsInitialize(&kops); DSDPCHKERR(info);
336 info=
DSDPAddCone(dsdp,&kops,(
void*)sdpcone); DSDPCHKERR(info);
337 DSDPFunctionReturn(0);
DSDPTruth
Boolean variables.
struct DSDPVec_C DSDPVec
This object hold m+2 variables: a scaling of C, the y variables, and r.
Schur complement matrix whose solution is the Newton direction.
int DSDPBlockDataMarkNonzeroMatrices(DSDPBlockData *ADATA, int *annz)
Mark which variable in block have a data matrix.
int SDPConeMultiply(SDPCone, int, double, DSDPVec, DSDPVec, DSDPVec)
Compute the gradient to the barrier term.
Error handling, printing, and profiling.
int DSDPDSMatSetArray(DSDPDSMat A, DSDPVMat T)
Set values into the matrix.
int SDPConeComputeXDot(SDPCone, int, DSDPVec, DSDPVMat, DSDPVec, double *, double *, double *)
Compute inner product of X with the Data, S, and norm of X.
int SDPConeDestroy(SDPCone)
Free data structure of the cone.
Internal structures for the DSDP solver.
int SDPConeComputeSS(SDPCone, int, DSDPVec, DSDPVMat)
Sum the data matrices.
Internal structure for block of semidefinite cone.
int DSDPDualMatInvert(DSDPDualMat S)
Invert the matrix.
int DSDPDualMatCholeskyFactor(DSDPDualMat S, DSDPTruth *psdefinite)
Factor the matrix.
int DSDPDualMatLogDeterminant(DSDPDualMat S, double *logdet)
Free the matrix structure.
Represents an S matrix for one block in the semidefinite cone.
int DSDPDualMatSetArray(DSDPDualMat S, DSDPVMat T)
Print the matrix.
int DSDPLanczosStepSize(DSDPLanczosStepLength *, SDPConeVec, SDPConeVec, DSDPDualMat, DSDPDSMat, double *)
Compute distance to boundary.
Implementations of a cone (SDP,LP,...) must provide a structure of function pointers.
struct SDPCone_C * SDPCone
The SDPCone object points to blocks of data that specify semidefinite matrix inequalities.
Internal structure for semidefinite cone.
int SDPConeComputeRHS(SDPCone, int, double, DSDPVec, DSDPVec, DSDPVec)
Compute the gradient to the barrier term.
DSDPDualFactorMatrix
DSDP requires two instances of the data structures S.
int SDPConeComputeHessian(SDPCone, double, DSDPSchurMat, DSDPVec, DSDPVec)
Compute the Hessian to the barrier term.
int SDPConeComputeX3(SDPCone, int, double, DSDPVec, DSDPVec, DSDPVMat)
Compute the matrix X with the given information.
Symmetric Delta S matrix for one block in the semidefinite cone.
Dense symmetric matrix for one block in the semidefinite cone.
int DSDPAddSDP(DSDP dsdp, SDPCone sdpcone)
Pass a semidefinite cone to the solver.
int DSDPAddCone(DSDP, struct DSDPCone_Ops *, void *)
Apply DSDP to a conic structure.
Internal SDPCone data structures and routines.
int DSDPConeOpsInitialize(struct DSDPCone_Ops *dops)
Initialize the function pointers to 0.
int SDPConeSetup(SDPCone, DSDPVec)
Allocate data structure of the cone.
int SDPConeSetup2(SDPCone, DSDPVec, DSDPSchurMat)
Allocate data structure of the cone.