DSDP
dsdpcone.c
Go to the documentation of this file.
1#include "dsdpcone_impl.h"
2#include "dsdpcone.h"
3#include "dsdpsys.h"
4
10#define DSDPNoOperationError(a); { DSDPSETERR1(10,"Cone type: %s, Operation not defined\n",(a).dsdpops->name); }
11#define DSDPChkConeError(a,b); { if (b){DSDPSETERR1(b,"Cone type: %s,\n",(a).dsdpops->name); } }
12
20#undef __FUNCT__
21#define __FUNCT__ "DSDPConeSetUp"
23 int info;
24 DSDPFunctionBegin;
25 if (K.dsdpops->conesetup){
26 info=K.dsdpops->conesetup(K.conedata,y);DSDPChkConeError(K,info);
27 } else {
28 DSDPNoOperationError(K);
29 }
30 DSDPFunctionReturn(0);
31}
32
41#undef __FUNCT__
42#define __FUNCT__ "DSDPConeSetUp2"
44 int info;
45 DSDPFunctionBegin;
46 if (K.dsdpops->conesetup2){
47 info=K.dsdpops->conesetup2(K.conedata,yy0,M);DSDPChkConeError(K,info);
48 } else {
49 DSDPNoOperationError(K);
50 }
51 DSDPFunctionReturn(0);
52}
53
54
62#undef __FUNCT__
63#define __FUNCT__ "DSDPConeDestroy"
65 int info;
66 DSDPFunctionBegin;
67 if ((*K).dsdpops->conedestroy){
68 info=(*K).dsdpops->conedestroy((*K).conedata);DSDPChkConeError(*K,info);
69 info=DSDPConeInitialize(K); DSDPCHKERR(info);
70 } else {
71 DSDPNoOperationError(*K);
72 }
73 DSDPFunctionReturn(0);
74}
75
76
90#undef __FUNCT__
91#define __FUNCT__ "DSDPConeComputeHessian"
92int DSDPConeComputeHessian( DSDPCone K , double mu, DSDPSchurMat M, DSDPVec vrhs1, DSDPVec vrhs2){
93 int info;
94 DSDPFunctionBegin;
95 if (K.dsdpops->conehessian){
96 info=K.dsdpops->conehessian(K.conedata,mu,M,vrhs1,vrhs2);DSDPChkConeError(K,info);
97 } else {
98 DSDPNoOperationError(K);
99 }
100 DSDPFunctionReturn(0);
101}
102
103
117#undef __FUNCT__
118#define __FUNCT__ "DSDPConeMultiplyAdd"
119int DSDPConeMultiplyAdd( DSDPCone K , double mu, DSDPVec vrow, DSDPVec v, DSDPVec vv){
120 int info;
121 DSDPFunctionBegin;
122 if (K.dsdpops->conehmultiplyadd){
123 info=K.dsdpops->conehmultiplyadd(K.conedata,mu,vrow,v,vv);DSDPChkConeError(K,info);
124 } else {
125 DSDPNoOperationError(K);
126 }
127 DSDPFunctionReturn(0);
128}
129
130
145#undef __FUNCT__
146#define __FUNCT__ "DSDPConeComputeRHS"
147int DSDPConeComputeRHS( DSDPCone K , double mu, DSDPVec vrow,DSDPVec rhs1,DSDPVec rhs2){
148 int info;
149 DSDPFunctionBegin;
150 if (K.dsdpops->conerhs){
151 info=K.dsdpops->conerhs(K.conedata,mu,vrow,rhs1,rhs2);DSDPChkConeError(K,info);
152 } else {
153 DSDPNoOperationError(K);
154 }
155 DSDPFunctionReturn(0);
156}
157
166#undef __FUNCT__
167#define __FUNCT__ "DSDPConeANorm2"
169 int info;
170 DSDPFunctionBegin;
171 if (K.dsdpops->coneanorm2){
172 info=K.dsdpops->coneanorm2(K.conedata,anorm2);DSDPChkConeError(K,info);
173 } else {
174 DSDPNoOperationError(K);
175 }
176 DSDPFunctionReturn(0);
177}
178
189#undef __FUNCT__
190#define __FUNCT__ "DSDPConeSetXMaker"
191int DSDPConeSetXMaker( DSDPCone K, double mu, DSDPVec y, DSDPVec dy){
192 int info;
193 DSDPFunctionBegin;
194 if (K.dsdpops->conesetxmaker){
195 info=K.dsdpops->conesetxmaker(K.conedata,mu,y,dy);DSDPChkConeError(K,info);
196 } else {
197 DSDPNoOperationError(K);
198 }
199 DSDPFunctionReturn(0);
200}
201
214#undef __FUNCT__
215#define __FUNCT__ "DSDPConeComputeX"
216int DSDPConeComputeX( DSDPCone K, double mu, DSDPVec y, DSDPVec dy, DSDPVec AX, double *tracexs){
217 int info;
218 double trxs;
219 DSDPFunctionBegin;
220 if (K.dsdpops->conecomputex){
221 trxs=0;
222 info=K.dsdpops->conecomputex(K.conedata,mu,y,dy,AX,&trxs);DSDPChkConeError(K,info);
223 *tracexs+=trxs;
224 } else {
225 DSDPNoOperationError(K);
226 }
227 DSDPFunctionReturn(0);
228}
229
240#undef __FUNCT__
241#define __FUNCT__ "DSDPConeComputeS"
243 int info;
244 DSDPFunctionBegin;
245 if (K.dsdpops->conecomputes){
246 info=K.dsdpops->conecomputes(K.conedata,Y,flag,ispsdefinite);DSDPChkConeError(K,info);
247 } else {
248 DSDPNoOperationError(K);
249 }
250 DSDPFunctionReturn(0);
251}
252
253
263#undef __FUNCT__
264#define __FUNCT__ "DSDPConeInvertS"
266 int info;
267 DSDPFunctionBegin;
268 if (K.dsdpops->coneinverts){
269 info=K.dsdpops->coneinverts(K.conedata);DSDPChkConeError(K,info);
270 } else {
271 DSDPNoOperationError(K);
272 }
273 DSDPFunctionReturn(0);
274}
275
286#undef __FUNCT__
287#define __FUNCT__ "DSDPConeComputeMaxStepLength"
289 int info;
290 double conesteplength=1.0e20;
291 DSDPFunctionBegin;
292 conesteplength=1.0e30;
293 if (K.dsdpops->conemaxsteplength){
294 info=K.dsdpops->conemaxsteplength(K.conedata,DY,flag,&conesteplength);DSDPChkConeError(K,info);
295 } else {
296 DSDPNoOperationError(K);
297 }
298 *maxsteplength=conesteplength;
299 DSDPFunctionReturn(0);
300}
301
310#undef __FUNCT__
311#define __FUNCT__ "DSDPConeGetDimension"
313 int info;
314 double nn=0;
315 DSDPFunctionBegin;
316 if (K.dsdpops->conesize){
317 info=K.dsdpops->conesize(K.conedata,&nn);DSDPChkConeError(K,info);
318 } else {
319 DSDPNoOperationError(K);
320 }
321 *n=nn;
322 DSDPFunctionReturn(0);
323}
324
336#undef __FUNCT__
337#define __FUNCT__ "DSDPSparsityInSchurMat"
338int DSDPConeSparsityInSchurMat(DSDPCone K, int row, int rnnz[], int m){
339 int info,tt;
340 DSDPFunctionBegin;
341 if (K.dsdpops->conesparsity){
342 info=K.dsdpops->conesparsity(K.conedata,row,&tt,rnnz,m);DSDPChkConeError(K,info);
343 } else {
344 DSDPNoOperationError(K);
345 }
346 DSDPFunctionReturn(0);
347}
348
356#undef __FUNCT__
357#define __FUNCT__ "DSDPConeView"
359 int info;
360 DSDPFunctionBegin;
361 if (K.dsdpops->coneview){
362 info=K.dsdpops->coneview(K.conedata);DSDPChkConeError(K,info);
363 } else {
364 DSDPNoOperationError(K);
365 }
366 DSDPFunctionReturn(0);
367}
368
378#undef __FUNCT__
379#define __FUNCT__ "DSDPConeMonitor"
380int DSDPConeMonitor(DSDPCone K, int tag){
381 int info;
382 DSDPFunctionBegin;
383 if (K.dsdpops->conemonitor){
384 info=K.dsdpops->conemonitor(K.conedata,tag);DSDPChkConeError(K,info);
385 } else {
386 DSDPNoOperationError(K);
387 }
388 DSDPFunctionReturn(0);
389}
390
391
401#undef __FUNCT__
402#define __FUNCT__ "DSDPConeComputeLogSDeterminant"
403int DSDPConeComputeLogSDeterminant(DSDPCone K, double *logdetobj, double *logdet){
404 int info;
405 double conepotential1=0,conepotential2=0;
406 DSDPFunctionBegin;
407 if (K.dsdpops->conelogpotential){
408 info=K.dsdpops->conelogpotential(K.conedata,&conepotential1,&conepotential2);DSDPChkConeError(K,info);
409 } else {
410 DSDPNoOperationError(K);
411 }
412 *logdetobj=conepotential1;
413 *logdet=conepotential2;
414 DSDPFunctionReturn(0);
415}
416
425#undef __FUNCT__
426#define __FUNCT__ "DSDPGetConeName"
427int DSDPGetConeName(DSDPCone K, char *cname, int maxlength){
428 DSDPFunctionBegin;
429 strncpy(cname,K.dsdpops->name,maxlength);
430 DSDPFunctionReturn(0);
431}
432
433
434
441#undef __FUNCT__
442#define __FUNCT__ "DSDPConeOpsInitialize"
443int DSDPConeOpsInitialize(struct DSDPCone_Ops* dops){
444 DSDPFunctionBegin;
445 if (dops==NULL) return 0;
446
447 dops->conesetup=0;
448 dops->conesetup2=0;
449 dops->conedestroy=0;
450 dops->coneanorm2=0;
451 dops->conehessian=0;
452 dops->conehmultiplyadd=0;
453 dops->conerhs=0;
454 dops->conesetxmaker=0;
455 dops->conecomputex=0;
456 dops->conecomputes=0;
457 dops->coneinverts=0;
458 dops->conemaxsteplength=0;
459 dops->conesparsity=0;
460 dops->conelogpotential=0;
461 dops->conemonitor=0;
462 dops->coneview=0;
463 dops->id=0;
464 DSDPFunctionReturn(0);
465}
466
475#undef __FUNCT__
476#define __FUNCT__ "DSDPConeSetData"
477int DSDPConeSetData(DSDPCone *K, struct DSDPCone_Ops* ops, void* data){
478 DSDPFunctionBegin;
479 (*K).dsdpops=ops;
480 (*K).conedata=data;
481 DSDPFunctionReturn(0);
482}
483
484
485static struct DSDPCone_Ops dsdpcops;
493#undef __FUNCT__
494#define __FUNCT__ "DSDPConeOpsInitialize"
496 int info;
497 DSDPFunctionBegin;
498 info=DSDPConeOpsInitialize(&dsdpcops); DSDPCHKERR(info);
499 info=DSDPConeSetData(K,&dsdpcops,0); DSDPCHKERR(info);
500 DSDPFunctionReturn(0);
501}
502
DSDPDualFactorMatrix
DSDP requires two instances of the data structures S.
DSDPTruth
Boolean variables.
int DSDPConeView(DSDPCone K)
View contents of the cone.
Definition dsdpcone.c:358
int DSDPConeComputeX(DSDPCone K, double mu, DSDPVec y, DSDPVec dy, DSDPVec AX, double *tracexs)
Given y,dy, and mu, construct X and add its inner product with the data and S.
Definition dsdpcone.c:216
int DSDPConeInitialize(DSDPCone *K)
Initialize the pointers to 0.
Definition dsdpcone.c:495
int DSDPGetConeName(DSDPCone K, char *cname, int maxlength)
Get name of the cone.
Definition dsdpcone.c:427
int DSDPConeComputeMaxStepLength(DSDPCone K, DSDPVec DY, DSDPDualFactorMatrix flag, double *maxsteplength)
Determine distance to the edge of the cone.
Definition dsdpcone.c:288
int DSDPConeComputeS(DSDPCone K, DSDPVec Y, DSDPDualFactorMatrix flag, DSDPTruth *ispsdefinite)
Given y, compute S and determine whether its in the cone.
Definition dsdpcone.c:242
int DSDPConeSetXMaker(DSDPCone K, double mu, DSDPVec y, DSDPVec dy)
Pass information needed to construct X.
Definition dsdpcone.c:191
int DSDPConeMonitor(DSDPCone K, int tag)
Do anything at in the cone at each iteration.
Definition dsdpcone.c:380
int DSDPConeComputeLogSDeterminant(DSDPCone K, double *logdetobj, double *logdet)
Evaluate logrithmic barrier function.
Definition dsdpcone.c:403
int DSDPConeInvertS(DSDPCone K)
Invert the dual matrix S.
Definition dsdpcone.c:265
int DSDPConeGetDimension(DSDPCone K, double *n)
Provide the dimension of the cone.
Definition dsdpcone.c:312
int DSDPConeSetUp(DSDPCone K, DSDPVec y)
Factor the data and allocate data structures.
Definition dsdpcone.c:22
int DSDPConeDestroy(DSDPCone *K)
Free the internal memory of the cone.
Definition dsdpcone.c:64
int DSDPConeComputeRHS(DSDPCone K, double mu, DSDPVec vrow, DSDPVec rhs1, DSDPVec rhs2)
Compute gradient of barrier function.
Definition dsdpcone.c:147
int DSDPConeSparsityInSchurMat(DSDPCone K, int row, int rnnz[], int m)
Identify sparsity pattern in a row of the Hessian term.
Definition dsdpcone.c:338
int DSDPConeComputeHessian(DSDPCone K, double mu, DSDPSchurMat M, DSDPVec vrhs1, DSDPVec vrhs2)
Compute Hessian and gradient of barrier function.
Definition dsdpcone.c:92
int DSDPConeSetData(DSDPCone *K, struct DSDPCone_Ops *ops, void *data)
Initialize the pointers to 0.
Definition dsdpcone.c:477
int DSDPConeMultiplyAdd(DSDPCone K, double mu, DSDPVec vrow, DSDPVec v, DSDPVec vv)
Multiply Hessian by a vector and add the result.
Definition dsdpcone.c:119
int DSDPConeOpsInitialize(struct DSDPCone_Ops *dops)
Initialize the function pointers to 0.
Definition dsdpcone.c:443
int DSDPConeSetUp2(DSDPCone K, DSDPVec yy0, DSDPSchurMat M)
Factor the data and allocate data structures.
Definition dsdpcone.c:43
int DSDPConeANorm2(DSDPCone K, DSDPVec anorm2)
Add square of 2-norm of data correponding to each variable y.
Definition dsdpcone.c:168
The public interface between the cones and the solver.
struct DSDPCone_C DSDPCone
This object holds the data of a SDP, LP, or other cone. Its structure is opaque to the DSDP Solver,...
Definition dsdpcone.h:27
Implementations of a cone (SDP,LP,...) must provide a structure of function pointers.
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
Schur complement matrix whose solution is the Newton direction.