17 static 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" 83 static int DSDPSetupBCone(
void* dspcone,
DSDPVec y){
85 DSDPFunctionReturn(0);
90 #define __FUNCT__ "DSDPSetDRData" 91 static 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" 115 static 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" 128 static int DSDPRSize(
void*dspcone,
double*n){
131 DSDPFunctionReturn(0);
135 #define __FUNCT__ "DSDPRSparsity" 136 static 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" 168 static 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" 193 static 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" 217 static int DSDPComputeRLog(
void *dspcone,
double *logobj,
double *logdet){
218 BDCone *K=(BDCone*)dspcone;
222 DSDPFunctionReturn(0);
226 #define __FUNCT__ "DSDPRANorm2" 227 static 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" 251 static int DSDPRMonitor(
void *dspcone,
int tag){
253 DSDPFunctionReturn(0);
256 static struct DSDPCone_Ops kops;
257 static const char* matname=
"Dual Obj Cone";
260 #define __FUNCT__ "BConeOperationsInitialize" 261 static 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" 288 int 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" 307 int DSDPSetDualLowerBound(
DSDP dsdp,
double dobjmin){
310 info = DSDPAddBCone(dsdp,dsdp->b,dobjmin);DSDPCHKERR(info);
311 DSDPFunctionReturn(0);
DSDPTruth
Boolean variables.
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.
Error handling, printing, and profiling.
Internal structures for the DSDP solver.
int DSDPSchurMatRowColumnScaling(DSDPSchurMat, int, DSDPVec, int *)
Get the scaling and nonzero pattern of each column in this row of the matrix.
The API to DSDP for those applications using DSDP as a subroutine library.
Internal data structure for the DSDP solver.
int DSDPSchurMatAddRow(DSDPSchurMat, int, double, DSDPVec)
Add elements to a row of the Schur matrix.
Implementations of a cone (SDP,LP,...) must provide a structure of function pointers.
DSDPDualFactorMatrix
DSDP requires two instances of the data structures S.
int DSDPAddCone(DSDP, struct DSDPCone_Ops *, void *)
Apply DSDP to a conic structure.
int DSDPConeOpsInitialize(struct DSDPCone_Ops *dops)
Initialize the function pointers to 0.