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