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"
92 int 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"
119 int 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"
147 int 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"
168 int DSDPConeANorm2( DSDPCone K , DSDPVec anorm2){
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"
191 int 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"
216 int 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"
288 int DSDPConeComputeMaxStepLength(DSDPCone K, DSDPVec DY, DSDPDualFactorMatrix flag, double *maxsteplength){
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"
312 int DSDPConeGetDimension(DSDPCone K, double *n){
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"
338 int 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"
380 int 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"
403 int 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"
427 int 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"
443 int 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"
477 int 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 
485 static 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 
DSDPTruth
Boolean variables.
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 DSDPConeInvertS(DSDPCone K)
Invert the dual matrix S.
Definition: dsdpcone.c:265
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.
Definition: dsdpschurmat.h:35
int DSDPConeANorm2(DSDPCone K, DSDPVec anorm2)
Add square of 2-norm of data correponding to each variable y.
Definition: dsdpcone.c:168
Error handling, printing, and profiling.
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 DSDPConeInitialize(DSDPCone *K)
Initialize the pointers to 0.
Definition: dsdpcone.c:495
int DSDPConeView(DSDPCone K)
View contents of the cone.
Definition: dsdpcone.c:358
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 DSDPConeComputeMaxStepLength(DSDPCone K, DSDPVec DY, DSDPDualFactorMatrix flag, double *maxsteplength)
Determine distance to the edge of the cone.
Definition: dsdpcone.c:288
int DSDPGetConeName(DSDPCone K, char *cname, int maxlength)
Get name of the cone.
Definition: dsdpcone.c:427
int DSDPConeSetUp2(DSDPCone K, DSDPVec yy0, DSDPSchurMat M)
Factor the data and allocate data structures.
Definition: dsdpcone.c:43
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
The public interface between the cones and the solver.
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 DSDPConeSetUp(DSDPCone K, DSDPVec y)
Factor the data and allocate data structures.
Definition: dsdpcone.c:22
int DSDPConeGetDimension(DSDPCone K, double *n)
Provide the dimension of the cone.
Definition: dsdpcone.c:312
Implementations of a cone (SDP,LP,...) must provide a structure of function pointers.
int DSDPConeSparsityInSchurMat(DSDPCone K, int row, int rnnz[], int m)
Identify sparsity pattern in a row of the Hessian term.
Definition: dsdpcone.c:338
DSDPDualFactorMatrix
DSDP requires two instances of the data structures S.
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 DSDPConeComputeLogSDeterminant(DSDPCone K, double *logdetobj, double *logdet)
Evaluate logrithmic barrier function.
Definition: dsdpcone.c:403
int DSDPConeOpsInitialize(struct DSDPCone_Ops *dops)
Initialize the function pointers to 0.
Definition: dsdpcone.c:443
int DSDPConeComputeHessian(DSDPCone K, double mu, DSDPSchurMat M, DSDPVec vrhs1, DSDPVec vrhs2)
Compute Hessian and gradient of barrier function.
Definition: dsdpcone.c:92