7static int SDPConeOperationsInitialize(
struct DSDPCone_Ops*);
9static int KSDPConeSetup(
void*,
DSDPVec);
11static int KSDPConeSize(
void*,
double*);
12static int KSDPConeSparsity(
void*,
int,
int[],
int[],
int);
16static int KSDPConeComputeLogSDeterminant(
void *,
double *,
double*);
18static 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"
60static int KSDPConeSetup(
void* K,
DSDPVec y){
64 SDPConeValid(sdpcone);
66 DSDPFunctionReturn(0);
70#define __FUNCT__ "KSDPConeSetup2"
76 DSDPFunctionReturn(0);
81#define __FUNCT__ "KSDPConeDestroy"
82static int KSDPConeDestroy(
void* K){
86 SDPConeValid(sdpcone);
88 DSDPFunctionReturn(0);
93#define __FUNCT__ "KSDPConeSize"
94static int KSDPConeSize(
void* K,
double *n){
97 SDPConeValid(sdpcone);
99 DSDPFunctionReturn(0);
103#define __FUNCT__ "KSDPConeSparsity"
104static 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"
159static 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"
210static 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"
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"
266static 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"
288int KSDPConeMonitor(
void *K,
int tag){
290 DSDPFunctionReturn(0);
293static struct DSDPCone_Ops kops;
294static const char *sdpconename =
"SDP Cone";
297#define __FUNCT__ "SDPConeOperationsInitialize"
298static 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);
struct SDPCone_C * SDPCone
The SDPCone object points to blocks of data that specify semidefinite matrix inequalities.
DSDPDualFactorMatrix
DSDP requires two instances of the data structures S.
DSDPTruth
Boolean variables.
int DSDPBlockDataMarkNonzeroMatrices(DSDPBlockData *ADATA, int *annz)
Mark which variable in block have a data matrix.
int DSDPConeOpsInitialize(struct DSDPCone_Ops *dops)
Initialize the function pointers to 0.
Implementations of a cone (SDP,LP,...) must provide a structure of function pointers.
int DSDPAddCone(DSDP, struct DSDPCone_Ops *, void *)
Apply DSDP to a conic structure.
int DSDPDSMatSetArray(DSDPDSMat A, DSDPVMat T)
Set values into the matrix.
int DSDPDualMatCholeskyFactor(DSDPDualMat S, DSDPTruth *psdefinite)
Factor the matrix.
int DSDPDualMatLogDeterminant(DSDPDualMat S, double *logdet)
Free the matrix structure.
int DSDPDualMatSetArray(DSDPDualMat S, DSDPVMat T)
Print the matrix.
int DSDPDualMatInvert(DSDPDualMat S)
Invert the matrix.
int DSDPLanczosStepSize(DSDPLanczosStepLength *, SDPConeVec, SDPConeVec, DSDPDualMat, DSDPDSMat, double *)
Compute distance to boundary.
Internal SDPCone data structures and routines.
int SDPConeMultiply(SDPCone, int, double, DSDPVec, DSDPVec, DSDPVec)
Compute the gradient to the barrier term.
int SDPConeComputeX3(SDPCone, int, double, DSDPVec, DSDPVec, DSDPVMat)
Compute the matrix X with the given information.
int SDPConeComputeRHS(SDPCone, int, double, DSDPVec, DSDPVec, DSDPVec)
Compute the gradient to the barrier term.
int SDPConeComputeHessian(SDPCone, double, DSDPSchurMat, DSDPVec, DSDPVec)
Compute the Hessian to the barrier term.
int SDPConeSetup2(SDPCone, DSDPVec, DSDPSchurMat)
Allocate data structure of the cone.
int SDPConeDestroy(SDPCone)
Free data structure of the cone.
int SDPConeSetup(SDPCone, DSDPVec)
Allocate data structure of the cone.
int SDPConeComputeSS(SDPCone, int, DSDPVec, DSDPVMat)
Sum the data matrices.
int SDPConeComputeXDot(SDPCone, int, DSDPVec, DSDPVMat, DSDPVec, double *, double *, double *)
Compute inner product of X with the Data, S, and norm of X.
Error handling, printing, and profiling.
struct DSDPVec_C DSDPVec
This object hold m+2 variables: a scaling of C, the y variables, and r.
int DSDPAddSDP(DSDP dsdp, SDPCone sdpcone)
Pass a semidefinite cone to the solver.
Symmetric Delta S matrix for one block in the semidefinite cone.
Represents an S matrix for one block in the semidefinite cone.
Schur complement matrix whose solution is the Newton direction.
Dense symmetric matrix for one block in the semidefinite cone.
Internal structures for the DSDP solver.
Internal structure for semidefinite cone.
Internal structure for block of semidefinite cone.