17static int BComputeS(BDCone *K,
DSDPVec v,
double *ss){
20 info=DSDPVecDot(K->bb,v,ss);DSDPCHKERR(info);
21 DSDPFunctionReturn(0);
25#define __FUNCT__ "DSDPRHessian"
27 BDCone *K=(BDCone*)dspcone;
28 double bb,dd,ss=K->dss;
33 info=DSDPVecGetSize(b,&m);DSDPCHKERR(info);
35 info=DSDPVecGetElement(b,i,&bb);DSDPCHKERR(info);
39 if (ncols==0)
continue;
41 info=DSDPVecGetElement(T,i,&dd);DSDPCHKERR(info);
42 info=DSDPVecAddElement(vrhs2,i,-bb*dd*mu/ss);DSDPCHKERR(info);
44 info=DSDPVecPointwiseMult(T,b,T);DSDPCHKERR(info);
46 info=DSDPVecScale(mu*bb/(ss*ss),T);DSDPCHKERR(info);
51 if (i==-m-1){info=DSDPVecView(T);}
54 DSDPFunctionReturn(0);
58 BDCone *K=(BDCone*)dcone;
59 double bb,dd,ss=K->dss;
64 info=DSDPVecGetSize(b,&m);DSDPCHKERR(info);
66 info=DSDPVecGetElement(b,i,&bb);DSDPCHKERR(info);
67 info=DSDPVecGetElement(vrow,i,&dd);DSDPCHKERR(info);
68 info=DSDPVecAddElement(vrhs2,i,-bb*dd*mu/ss);DSDPCHKERR(info);
78 DSDPFunctionReturn(0);
82#define __FUNCT__ "DSDPSetupBCone"
83static int DSDPSetupBCone(
void* dspcone,
DSDPVec y){
85 DSDPFunctionReturn(0);
90#define __FUNCT__ "DSDPSetDRData"
91static int DSDPSetDRData(BDCone *K){
94 info=DSDPVecCopy(K->b,K->bb);DSDPCHKERR(info);
95 info=DSDPVecSetC(K->bb,K->dmin);DSDPCHKERR(info);
96 info=DSDPVecSetR(K->bb,-1.0);DSDPCHKERR(info);
97 DSDPFunctionReturn(0);
101#define __FUNCT__ "DSDPSetupBCone2"
103 BDCone *K=(BDCone*)dspcone;
106 info=DSDPVecDuplicate(K->b,&K->T);DSDPCHKERR(info);
107 info=DSDPVecDuplicate(K->b,&K->bb);DSDPCHKERR(info);
108 info=DSDPSetDRData(K);DSDPCHKERR(info);
109 DSDPFunctionReturn(0);
114#define __FUNCT__ "DSDPDestroyBCone"
115static int DSDPDestroyBCone(
void* dspcone){
116 BDCone *K=(BDCone*)dspcone;
119 info=DSDPVecDestroy(&K->T);DSDPCHKERR(info);
120 info=DSDPVecDestroy(&K->bb);DSDPCHKERR(info);
121 DSDPFREE(&dspcone,&info);DSDPCHKERR(info);
122 DSDPFunctionReturn(0);
127#define __FUNCT__ "DSDPRSize"
128static int DSDPRSize(
void*dspcone,
double*n){
131 DSDPFunctionReturn(0);
135#define __FUNCT__ "DSDPRSparsity"
136static int DSDPRSparsity(
void*dspcone,
int row,
int *tnnz,
int rnnz[],
int m){
137 BDCone *K=(BDCone*)dspcone;
138 int i,info;
double dd;
142 info=DSDPVecGetElement(K->b,row,&dd);DSDPCHKERR(info);
145 info=DSDPVecGetElement(K->b,i,&dd);DSDPCHKERR(info);
146 if (dd!=0){rnnz[i]++; (*tnnz)++;}
149 DSDPFunctionReturn(0);
153#define __FUNCT__ "DSDPComputeRS"
155 BDCone *K=(BDCone*)dspcone;
159 info=BComputeS(K,Y,&ss);DSDPCHKERR(info);
161 if (flag==
DUAL_FACTOR){ K->dss=ss; }
else { K->pss=ss;}
162 DSDPLogInfo(0,2,
"DOBJCone SS: %4.4e \n",ss);
163 DSDPFunctionReturn(0);
167#define __FUNCT__ "DSDPInvertRS"
168static int DSDPInvertRS(
void *dspcone){
170 DSDPFunctionReturn(0);
175#define __FUNCT__ "DSDPComputeRStepLength"
177 BDCone *K=(BDCone*)dspcone;
178 double ds,ss,rt=1.0e30;
182 info=BComputeS(K,DY,&ds);DSDPCHKERR(info);
183 if (flag==
DUAL_FACTOR){ ss=K->dss; }
else { ss=K->pss;}
188 DSDPFunctionReturn(0);
192#define __FUNCT__ "DSDPSetX"
193static int DSDPSetX(
void *dspcone,
double mu,
DSDPVec y,
DSDPVec dy){
195 DSDPFunctionReturn(0);
198#define __FUNCT__ "DSDPRX"
200 BDCone *K=(BDCone*)dspcone;
201 double x,dss,ss=K->dss;
205 info=BComputeS(K,y,&ss);DSDPCHKERR(info);
207 info=BComputeS(K,dy,&dss);DSDPCHKERR(info);
209 DSDPLogInfo(0,2,
"DOBJCone SS: %4.4e, RESIDUAL X: %4.4e\n",1.0/ss,x);
210 if (fabs(x*ss)>1.0 && mu < 1) printf(
"Check Dual Min Bound\n");
211 info=DSDPVecAXPY(-x,K->bb,AX);DSDPCHKERR(info);
212 DSDPFunctionReturn(0);
216#define __FUNCT__ "DSDPComputeRLog"
217static int DSDPComputeRLog(
void *dspcone,
double *logobj,
double *logdet){
218 BDCone *K=(BDCone*)dspcone;
222 DSDPFunctionReturn(0);
226#define __FUNCT__ "DSDPRANorm2"
227static int DSDPRANorm2(
void *dspcone,
DSDPVec Anorm2){
229 DSDPFunctionReturn(0);
234#define __FUNCT__ "DSDPRMultiplyAdd"
236 BDCone *K=(BDCone*)dspcone;
241 info=DSDPVecDot(vin,K->bb,&dd);DSDPCHKERR(info);
243 info=DSDPVecPointwiseMult(K->bb,vrow,T);DSDPCHKERR(info);
244 info=DSDPVecAXPY(dd,T,vout);DSDPCHKERR(info);
245 DSDPFunctionReturn(0);
250#define __FUNCT__ "DSDPRMonitor"
251static int DSDPRMonitor(
void *dspcone,
int tag){
253 DSDPFunctionReturn(0);
256static struct DSDPCone_Ops kops;
257static const char* matname=
"Dual Obj Cone";
260#define __FUNCT__ "BConeOperationsInitialize"
261static int BConeOperationsInitialize(
struct DSDPCone_Ops* coneops){
263 if (coneops==NULL)
return 0;
265 coneops->conehessian=DSDPRHessian;
266 coneops->conesetup=DSDPSetupBCone;
267 coneops->conesetup2=DSDPSetupBCone2;
268 coneops->conedestroy=DSDPDestroyBCone;
269 coneops->conecomputes=DSDPComputeRS;
270 coneops->coneinverts=DSDPInvertRS;
271 coneops->conecomputex=DSDPRX;
272 coneops->conesetxmaker=DSDPSetX;
273 coneops->conemaxsteplength=DSDPComputeRStepLength;
274 coneops->conelogpotential=DSDPComputeRLog;
275 coneops->conesize=DSDPRSize;
276 coneops->conesparsity=DSDPRSparsity;
277 coneops->coneanorm2=DSDPRANorm2;
278 coneops->conemonitor=DSDPRMonitor;
279 coneops->conehmultiplyadd=DSDPRMultiplyAdd;
280 coneops->conerhs=DSDPRRHS;
282 coneops->name=matname;
287#define __FUNCT__ "DSDPAddBCone"
288int DSDPAddBCone(
DSDP dsdp,
DSDPVec bb,
double dmin){
292 info=BConeOperationsInitialize(&kops); DSDPCHKERR(info);
293 DSDPCALLOC1(&rcone,BDCone,&info); DSDPCHKERR(info);
298 info=
DSDPAddCone(dsdp,&kops,(
void*)rcone); DSDPCHKERR(info);
299 DSDPFunctionReturn(0);
306#define __FUNCT__ "DSDPSetDualLowerBound"
307int DSDPSetDualLowerBound(
DSDP dsdp,
double dobjmin){
310 info = DSDPAddBCone(dsdp,dsdp->b,dobjmin);DSDPCHKERR(info);
311 DSDPFunctionReturn(0);
The API to DSDP for those applications using DSDP as a subroutine library.
Internal data structure for the DSDP solver.
DSDPDualFactorMatrix
DSDP requires two instances of the data structures S.
DSDPTruth
Boolean variables.
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 DSDPSchurMatRowColumnScaling(DSDPSchurMat, int, DSDPVec, int *)
Get the scaling and nonzero pattern of each column in this row of the matrix.
int DSDPSchurMatAddRow(DSDPSchurMat, int, double, DSDPVec)
Add elements to a row of the Schur matrix.
Error handling, printing, and profiling.
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.
Internal structures for the DSDP solver.