DSDP
|
00001 #include "dsdpcone_impl.h" 00002 #include "dsdpcone.h" 00003 #include "dsdpsys.h" 00004 00010 #define DSDPNoOperationError(a); { DSDPSETERR1(10,"Cone type: %s, Operation not defined\n",(a).dsdpops->name); } 00011 #define DSDPChkConeError(a,b); { if (b){DSDPSETERR1(b,"Cone type: %s,\n",(a).dsdpops->name); } } 00012 00020 #undef __FUNCT__ 00021 #define __FUNCT__ "DSDPConeSetUp" 00022 int DSDPConeSetUp(DSDPCone K,DSDPVec y){ 00023 int info; 00024 DSDPFunctionBegin; 00025 if (K.dsdpops->conesetup){ 00026 info=K.dsdpops->conesetup(K.conedata,y);DSDPChkConeError(K,info); 00027 } else { 00028 DSDPNoOperationError(K); 00029 } 00030 DSDPFunctionReturn(0); 00031 } 00032 00041 #undef __FUNCT__ 00042 #define __FUNCT__ "DSDPConeSetUp2" 00043 int DSDPConeSetUp2(DSDPCone K, DSDPVec yy0, DSDPSchurMat M){ 00044 int info; 00045 DSDPFunctionBegin; 00046 if (K.dsdpops->conesetup2){ 00047 info=K.dsdpops->conesetup2(K.conedata,yy0,M);DSDPChkConeError(K,info); 00048 } else { 00049 DSDPNoOperationError(K); 00050 } 00051 DSDPFunctionReturn(0); 00052 } 00053 00054 00062 #undef __FUNCT__ 00063 #define __FUNCT__ "DSDPConeDestroy" 00064 int DSDPConeDestroy(DSDPCone *K){ 00065 int info; 00066 DSDPFunctionBegin; 00067 if ((*K).dsdpops->conedestroy){ 00068 info=(*K).dsdpops->conedestroy((*K).conedata);DSDPChkConeError(*K,info); 00069 info=DSDPConeInitialize(K); DSDPCHKERR(info); 00070 } else { 00071 DSDPNoOperationError(*K); 00072 } 00073 DSDPFunctionReturn(0); 00074 } 00075 00076 00090 #undef __FUNCT__ 00091 #define __FUNCT__ "DSDPConeComputeHessian" 00092 int DSDPConeComputeHessian( DSDPCone K , double mu, DSDPSchurMat M, DSDPVec vrhs1, DSDPVec vrhs2){ 00093 int info; 00094 DSDPFunctionBegin; 00095 if (K.dsdpops->conehessian){ 00096 info=K.dsdpops->conehessian(K.conedata,mu,M,vrhs1,vrhs2);DSDPChkConeError(K,info); 00097 } else { 00098 DSDPNoOperationError(K); 00099 } 00100 DSDPFunctionReturn(0); 00101 } 00102 00103 00117 #undef __FUNCT__ 00118 #define __FUNCT__ "DSDPConeMultiplyAdd" 00119 int DSDPConeMultiplyAdd( DSDPCone K , double mu, DSDPVec vrow, DSDPVec v, DSDPVec vv){ 00120 int info; 00121 DSDPFunctionBegin; 00122 if (K.dsdpops->conehmultiplyadd){ 00123 info=K.dsdpops->conehmultiplyadd(K.conedata,mu,vrow,v,vv);DSDPChkConeError(K,info); 00124 } else { 00125 DSDPNoOperationError(K); 00126 } 00127 DSDPFunctionReturn(0); 00128 } 00129 00130 00145 #undef __FUNCT__ 00146 #define __FUNCT__ "DSDPConeComputeRHS" 00147 int DSDPConeComputeRHS( DSDPCone K , double mu, DSDPVec vrow,DSDPVec rhs1,DSDPVec rhs2){ 00148 int info; 00149 DSDPFunctionBegin; 00150 if (K.dsdpops->conerhs){ 00151 info=K.dsdpops->conerhs(K.conedata,mu,vrow,rhs1,rhs2);DSDPChkConeError(K,info); 00152 } else { 00153 DSDPNoOperationError(K); 00154 } 00155 DSDPFunctionReturn(0); 00156 } 00157 00166 #undef __FUNCT__ 00167 #define __FUNCT__ "DSDPConeANorm2" 00168 int DSDPConeANorm2( DSDPCone K , DSDPVec anorm2){ 00169 int info; 00170 DSDPFunctionBegin; 00171 if (K.dsdpops->coneanorm2){ 00172 info=K.dsdpops->coneanorm2(K.conedata,anorm2);DSDPChkConeError(K,info); 00173 } else { 00174 DSDPNoOperationError(K); 00175 } 00176 DSDPFunctionReturn(0); 00177 } 00178 00189 #undef __FUNCT__ 00190 #define __FUNCT__ "DSDPConeSetXMaker" 00191 int DSDPConeSetXMaker( DSDPCone K, double mu, DSDPVec y, DSDPVec dy){ 00192 int info; 00193 DSDPFunctionBegin; 00194 if (K.dsdpops->conesetxmaker){ 00195 info=K.dsdpops->conesetxmaker(K.conedata,mu,y,dy);DSDPChkConeError(K,info); 00196 } else { 00197 DSDPNoOperationError(K); 00198 } 00199 DSDPFunctionReturn(0); 00200 } 00201 00214 #undef __FUNCT__ 00215 #define __FUNCT__ "DSDPConeComputeX" 00216 int DSDPConeComputeX( DSDPCone K, double mu, DSDPVec y, DSDPVec dy, DSDPVec AX, double *tracexs){ 00217 int info; 00218 double trxs; 00219 DSDPFunctionBegin; 00220 if (K.dsdpops->conecomputex){ 00221 trxs=0; 00222 info=K.dsdpops->conecomputex(K.conedata,mu,y,dy,AX,&trxs);DSDPChkConeError(K,info); 00223 *tracexs+=trxs; 00224 } else { 00225 DSDPNoOperationError(K); 00226 } 00227 DSDPFunctionReturn(0); 00228 } 00229 00240 #undef __FUNCT__ 00241 #define __FUNCT__ "DSDPConeComputeS" 00242 int DSDPConeComputeS(DSDPCone K, DSDPVec Y, DSDPDualFactorMatrix flag, DSDPTruth *ispsdefinite){ 00243 int info; 00244 DSDPFunctionBegin; 00245 if (K.dsdpops->conecomputes){ 00246 info=K.dsdpops->conecomputes(K.conedata,Y,flag,ispsdefinite);DSDPChkConeError(K,info); 00247 } else { 00248 DSDPNoOperationError(K); 00249 } 00250 DSDPFunctionReturn(0); 00251 } 00252 00253 00263 #undef __FUNCT__ 00264 #define __FUNCT__ "DSDPConeInvertS" 00265 int DSDPConeInvertS(DSDPCone K){ 00266 int info; 00267 DSDPFunctionBegin; 00268 if (K.dsdpops->coneinverts){ 00269 info=K.dsdpops->coneinverts(K.conedata);DSDPChkConeError(K,info); 00270 } else { 00271 DSDPNoOperationError(K); 00272 } 00273 DSDPFunctionReturn(0); 00274 } 00275 00286 #undef __FUNCT__ 00287 #define __FUNCT__ "DSDPConeComputeMaxStepLength" 00288 int DSDPConeComputeMaxStepLength(DSDPCone K, DSDPVec DY, DSDPDualFactorMatrix flag, double *maxsteplength){ 00289 int info; 00290 double conesteplength=1.0e20; 00291 DSDPFunctionBegin; 00292 conesteplength=1.0e30; 00293 if (K.dsdpops->conemaxsteplength){ 00294 info=K.dsdpops->conemaxsteplength(K.conedata,DY,flag,&conesteplength);DSDPChkConeError(K,info); 00295 } else { 00296 DSDPNoOperationError(K); 00297 } 00298 *maxsteplength=conesteplength; 00299 DSDPFunctionReturn(0); 00300 } 00301 00310 #undef __FUNCT__ 00311 #define __FUNCT__ "DSDPConeGetDimension" 00312 int DSDPConeGetDimension(DSDPCone K, double *n){ 00313 int info; 00314 double nn=0; 00315 DSDPFunctionBegin; 00316 if (K.dsdpops->conesize){ 00317 info=K.dsdpops->conesize(K.conedata,&nn);DSDPChkConeError(K,info); 00318 } else { 00319 DSDPNoOperationError(K); 00320 } 00321 *n=nn; 00322 DSDPFunctionReturn(0); 00323 } 00324 00336 #undef __FUNCT__ 00337 #define __FUNCT__ "DSDPSparsityInSchurMat" 00338 int DSDPConeSparsityInSchurMat(DSDPCone K, int row, int rnnz[], int m){ 00339 int info,tt; 00340 DSDPFunctionBegin; 00341 if (K.dsdpops->conesparsity){ 00342 info=K.dsdpops->conesparsity(K.conedata,row,&tt,rnnz,m);DSDPChkConeError(K,info); 00343 } else { 00344 DSDPNoOperationError(K); 00345 } 00346 DSDPFunctionReturn(0); 00347 } 00348 00356 #undef __FUNCT__ 00357 #define __FUNCT__ "DSDPConeView" 00358 int DSDPConeView(DSDPCone K){ 00359 int info; 00360 DSDPFunctionBegin; 00361 if (K.dsdpops->coneview){ 00362 info=K.dsdpops->coneview(K.conedata);DSDPChkConeError(K,info); 00363 } else { 00364 DSDPNoOperationError(K); 00365 } 00366 DSDPFunctionReturn(0); 00367 } 00368 00378 #undef __FUNCT__ 00379 #define __FUNCT__ "DSDPConeMonitor" 00380 int DSDPConeMonitor(DSDPCone K, int tag){ 00381 int info; 00382 DSDPFunctionBegin; 00383 if (K.dsdpops->conemonitor){ 00384 info=K.dsdpops->conemonitor(K.conedata,tag);DSDPChkConeError(K,info); 00385 } else { 00386 DSDPNoOperationError(K); 00387 } 00388 DSDPFunctionReturn(0); 00389 } 00390 00391 00401 #undef __FUNCT__ 00402 #define __FUNCT__ "DSDPConeComputeLogSDeterminant" 00403 int DSDPConeComputeLogSDeterminant(DSDPCone K, double *logdetobj, double *logdet){ 00404 int info; 00405 double conepotential1=0,conepotential2=0; 00406 DSDPFunctionBegin; 00407 if (K.dsdpops->conelogpotential){ 00408 info=K.dsdpops->conelogpotential(K.conedata,&conepotential1,&conepotential2);DSDPChkConeError(K,info); 00409 } else { 00410 DSDPNoOperationError(K); 00411 } 00412 *logdetobj=conepotential1; 00413 *logdet=conepotential2; 00414 DSDPFunctionReturn(0); 00415 } 00416 00425 #undef __FUNCT__ 00426 #define __FUNCT__ "DSDPGetConeName" 00427 int DSDPGetConeName(DSDPCone K, char *cname, int maxlength){ 00428 DSDPFunctionBegin; 00429 strncpy(cname,K.dsdpops->name,maxlength); 00430 DSDPFunctionReturn(0); 00431 } 00432 00433 00434 00441 #undef __FUNCT__ 00442 #define __FUNCT__ "DSDPConeOpsInitialize" 00443 int DSDPConeOpsInitialize(struct DSDPCone_Ops* dops){ 00444 DSDPFunctionBegin; 00445 if (dops==NULL) return 0; 00446 00447 dops->conesetup=0; 00448 dops->conesetup2=0; 00449 dops->conedestroy=0; 00450 dops->coneanorm2=0; 00451 dops->conehessian=0; 00452 dops->conehmultiplyadd=0; 00453 dops->conerhs=0; 00454 dops->conesetxmaker=0; 00455 dops->conecomputex=0; 00456 dops->conecomputes=0; 00457 dops->coneinverts=0; 00458 dops->conemaxsteplength=0; 00459 dops->conesparsity=0; 00460 dops->conelogpotential=0; 00461 dops->conemonitor=0; 00462 dops->coneview=0; 00463 dops->id=0; 00464 DSDPFunctionReturn(0); 00465 } 00466 00475 #undef __FUNCT__ 00476 #define __FUNCT__ "DSDPConeSetData" 00477 int DSDPConeSetData(DSDPCone *K, struct DSDPCone_Ops* ops, void* data){ 00478 DSDPFunctionBegin; 00479 (*K).dsdpops=ops; 00480 (*K).conedata=data; 00481 DSDPFunctionReturn(0); 00482 } 00483 00484 00485 static struct DSDPCone_Ops dsdpcops; 00493 #undef __FUNCT__ 00494 #define __FUNCT__ "DSDPConeOpsInitialize" 00495 int DSDPConeInitialize(DSDPCone *K){ 00496 int info; 00497 DSDPFunctionBegin; 00498 info=DSDPConeOpsInitialize(&dsdpcops); DSDPCHKERR(info); 00499 info=DSDPConeSetData(K,&dsdpcops,0); DSDPCHKERR(info); 00500 DSDPFunctionReturn(0); 00501 } 00502