7 static int SDPConeOperationsInitialize(
struct DSDPCone_Ops*);
9 static int KSDPConeSetup(
void*,
DSDPVec);
11 static int KSDPConeSize(
void*,
double*);
12 static int KSDPConeSparsity(
void*,
int,
int[],
int[],
int);
16 static int KSDPConeComputeLogSDeterminant(
void *,
double *,
double*);
18 static 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"
60 static int KSDPConeSetup(
void* K,
DSDPVec y){
64 SDPConeValid(sdpcone);
66 DSDPFunctionReturn(0);
70 #define __FUNCT__ "KSDPConeSetup2"
76 DSDPFunctionReturn(0);
81 #define __FUNCT__ "KSDPConeDestroy"
82 static int KSDPConeDestroy(
void* K){
86 SDPConeValid(sdpcone);
88 DSDPFunctionReturn(0);
93 #define __FUNCT__ "KSDPConeSize"
94 static int KSDPConeSize(
void* K,
double *n){
97 SDPConeValid(sdpcone);
99 DSDPFunctionReturn(0);
103 #define __FUNCT__ "KSDPConeSparsity"
104 static 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"
159 static 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"
210 static 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"
228 static int KSDPConeSetX(
void *K,
double mu,
DSDPVec Y,
DSDPVec DY){
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"
266 static 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"
288 int KSDPConeMonitor(
void *K,
int tag){
290 DSDPFunctionReturn(0);
293 static struct DSDPCone_Ops kops;
294 static const char *sdpconename =
"SDP Cone";
297 #define __FUNCT__ "SDPConeOperationsInitialize"
298 static 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);