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.
DSDPTruth
Boolean variables.
DSDPDualFactorMatrix
DSDP requires two instances of the data structures S.
struct DSDP_C * DSDP
An implementation of the dual-scaling algorithm for semidefinite programming.
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.
struct DSDPDSMat_C DSDPDSMat
A symmetric Delta S matrix for one block in the semidefinite cone.
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.
struct DSDPDualMat_C DSDPDualMat
Represents an S matrix for one block in the semidefinite cone.
int DSDPLanczosStepSize(DSDPLanczosStepLength *, SDPConeVec, SDPConeVec, DSDPDualMat, DSDPDSMat, double *)
Compute distance to boundary.
struct DSDPSchurMat_C DSDPSchurMat
This object represents the Schur Matrix. Its structure is opaque to the DSDP solver,...
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.
struct DSDPVMat_C DSDPVMat
Represents a dense symmetric matrix for one block in the semidefinite cone.
int DSDPAddSDP(DSDP dsdp, SDPCone sdpcone)
Pass a semidefinite cone to the solver.
Internal structure for block of semidefinite cone.