DSDP
|
00001 #include "dsdp.h" 00002 #include "dsdpsys.h" 00008 #define DSDPCHKCONEERR(a,b); { if (b){ DSDPSETERR1(b,"Cone Number: %d,\n",a);} } 00009 00010 static int ConeSetup=0,ConeComputeS=0,ConeComputeSS=0,ConeComputeH=0,ConeHMultiplyAdd=0,ConeMaxPStep=0,ConeMaxDStep=0,ConePotential=0,ConeComputeX=0,ConeView=0,ConeDestroy=0,ConeXEigs=0,ConeRHS=0,ConeInvertS=0; 00011 static int DSDPRegisterConeEvents(void); 00012 int DSDPSetSchurMatOps(DSDP,struct DSDPSchurMat_Ops*, void*); 00013 int DSDPAddSchurRow(DSDP,int, DSDPVec); 00014 /* 00015 int DSDPIdentifySchurColumns(DSDP,int, int*, int*, int); 00016 */ 00017 00018 #undef __FUNCT__ 00019 #define __FUNCT__ "DSDPZeroConeEvents" 00020 static int DSDPZeroConeEvents(){ 00021 DSDPFunctionBegin; 00022 ConeSetup=0;ConeComputeS=0;ConeComputeSS=0;ConeComputeH=0;ConeHMultiplyAdd=0;ConeMaxPStep=0;ConeMaxDStep=0;ConePotential=0;ConeComputeX=0;ConeView=0;ConeDestroy=0;ConeXEigs=0;ConeRHS=0;ConeInvertS=0; 00023 DSDPFunctionReturn(0); 00024 } 00025 00026 #undef __FUNCT__ 00027 #define __FUNCT__ "DSDPRegisterConeEvents" 00028 static int DSDPRegisterConeEvents(){ 00029 00030 DSDPFunctionBegin; 00031 DSDPEventLogRegister("Cone Setup 1&2",&ConeSetup); 00032 DSDPEventLogRegister("Cone Invert S",&ConeInvertS); 00033 DSDPEventLogRegister("Cone RHS",&ConeRHS); 00034 DSDPEventLogRegister("Cone Compute Newton Eq.",&ConeComputeH); 00035 DSDPEventLogRegister("Cone Newton Multiply-Add",&ConeHMultiplyAdd); 00036 DSDPEventLogRegister("Cone Max P Step Length",&ConeMaxPStep); 00037 DSDPEventLogRegister("Cone Compute and Factor SP",&ConeComputeSS); 00038 DSDPEventLogRegister("Cone Max D Step Length",&ConeMaxDStep); 00039 DSDPEventLogRegister("Cone Compute and Factor S",&ConeComputeS); 00040 DSDPEventLogRegister("Cone Potential",&ConePotential); 00041 DSDPEventLogRegister("Cone View",&ConeView); 00042 DSDPEventLogRegister("Cone Compute X",&ConeComputeX); 00043 DSDPEventLogRegister("Cone X Residuals",&ConeXEigs); 00044 DSDPEventLogRegister("Cone Destroy",&ConeDestroy); 00045 00046 DSDPFunctionReturn(0); 00047 } 00048 00056 #undef __FUNCT__ 00057 #define __FUNCT__ "DSDPSetUpCones" 00058 int DSDPSetUpCones(DSDP dsdp){ 00059 int info,kk; 00060 DSDPVec yy0=dsdp->y; 00061 DSDPFunctionBegin; 00062 info=DSDPRegisterConeEvents(); 00063 DSDPEventLogBegin(ConeSetup); 00064 for (kk=0;kk<dsdp->ncones;kk++){ 00065 DSDPEventLogBegin(dsdp->K[kk].coneid); 00066 info=DSDPConeSetUp(dsdp->K[kk].cone,yy0);DSDPCHKCONEERR(kk,info); 00067 DSDPEventLogEnd(dsdp->K[kk].coneid); 00068 } 00069 DSDPEventLogEnd(ConeSetup); 00070 DSDPFunctionReturn(0); 00071 } 00072 00082 #undef __FUNCT__ 00083 #define __FUNCT__ "DSDPSetUpCones2" 00084 int DSDPSetUpCones2(DSDP dsdp, DSDPVec yy0, DSDPSchurMat M){ 00085 int info,kk; 00086 DSDPFunctionBegin; 00087 DSDPEventLogBegin(ConeSetup); 00088 for (kk=0;kk<dsdp->ncones;kk++){ 00089 DSDPEventLogBegin(dsdp->K[kk].coneid); 00090 info=DSDPConeSetUp2(dsdp->K[kk].cone,yy0,M);DSDPCHKCONEERR(kk,info); 00091 DSDPEventLogEnd(dsdp->K[kk].coneid); 00092 } 00093 DSDPEventLogEnd(ConeSetup); 00094 DSDPFunctionReturn(0); 00095 } 00096 00097 00105 #undef __FUNCT__ 00106 #define __FUNCT__ "DSDPDestroyCones" 00107 int DSDPDestroyCones(DSDP dsdp){ 00108 int info,kk,ncones=dsdp->ncones; 00109 DSDPFunctionBegin; 00110 DSDPEventLogBegin(ConeDestroy); 00111 for (kk=ncones-1;kk>=0; kk--){ 00112 DSDPEventLogBegin(dsdp->K[kk].coneid); 00113 info=DSDPConeDestroy(&dsdp->K[kk].cone);DSDPCHKCONEERR(kk,info); 00114 DSDPEventLogEnd(dsdp->K[kk].coneid); 00115 info=DSDPConeInitialize(&dsdp->K[kk].cone);DSDPCHKCONEERR(kk,info); 00116 dsdp->ncones--; 00117 } 00118 if (dsdp->maxcones>0){ 00119 DSDPFREE(&dsdp->K,&info);DSDPCHKERR(info); 00120 dsdp->K=0; 00121 dsdp->maxcones=0; 00122 } 00123 DSDPEventLogEnd(ConeDestroy); 00124 info=DSDPZeroConeEvents();DSDPCHKERR(info); 00125 DSDPFunctionReturn(0); 00126 } 00127 00128 00140 #undef __FUNCT__ 00141 #define __FUNCT__ "DSDPComputeHessian" 00142 int DSDPComputeHessian( DSDP dsdp , DSDPSchurMat M, DSDPVec vrhs1, DSDPVec vrhs2){ 00143 int info,kk; double r; 00144 DSDPFunctionBegin; 00145 DSDPEventLogBegin(ConeComputeH); 00146 dsdp->schurmu=dsdp->mutarget; 00147 info=DSDPVecGetR(dsdp->y,&r);DSDPCHKERR(info); 00148 info=DSDPSchurMatSetR(dsdp->M,r);DSDPCHKERR(info); 00149 info=DSDPSchurMatZeroEntries(M);DSDPCHKERR(info); 00150 info=DSDPVecZero(vrhs1);DSDPCHKERR(info); 00151 info=DSDPVecZero(vrhs2);DSDPCHKERR(info); 00152 info=DSDPVecZero(M.schur->rhs3);DSDPCHKERR(info); 00153 info=DSDPObjectiveGH(dsdp,M,vrhs1); DSDPCHKERR(info); 00154 for (kk=dsdp->ncones-1;kk>=0;kk--){ 00155 DSDPEventLogBegin(dsdp->K[kk].coneid); 00156 info=DSDPConeComputeHessian(dsdp->K[kk].cone,dsdp->schurmu,M,vrhs1,vrhs2);DSDPCHKCONEERR(kk,info); 00157 DSDPEventLogEnd(dsdp->K[kk].coneid); 00158 } 00159 info=DSDPSchurMatAssemble(M);DSDPCHKERR(info); 00160 /* DSDPSchurMatView(M); */ 00161 info=DSDPSchurMatReducePVec(M,vrhs1);DSDPCHKERR(info); 00162 info=DSDPSchurMatReducePVec(M,vrhs2);DSDPCHKERR(info); 00163 info=DSDPSchurMatReducePVec(M,M.schur->rhs3);DSDPCHKERR(info); 00164 if (0 && dsdp->UsePenalty==DSDPNever){ 00165 info=DSDPVecAXPY(1.0,M.schur->rhs3,vrhs2);DSDPCHKERR(info); 00166 info=DSDPVecZero(M.schur->rhs3);DSDPCHKERR(info); 00167 info=DSDPVecZero(M.schur->dy3);DSDPCHKERR(info); 00168 info=DSDPVecSetR(vrhs1,0);DSDPCHKERR(info); 00169 info=DSDPVecSetR(vrhs2,r);DSDPCHKERR(info); 00170 } 00171 DSDPEventLogEnd(ConeComputeH); 00172 DSDPFunctionReturn(0); 00173 } 00174 00175 00176 #undef __FUNCT__ 00177 #define __FUNCT__ "DSDPHessianMultiplyAdd" 00178 00188 int DSDPHessianMultiplyAdd( DSDP dsdp , DSDPVec v, DSDPVec vv){ 00189 int info,kk; 00190 DSDPVec vrow=dsdp->sles->BR; 00191 DSDPFunctionBegin; 00192 DSDPEventLogBegin(ConeHMultiplyAdd); 00193 00194 info=DSDPSchurMatRowScaling(dsdp->M,vrow);DSDPCHKERR(info); 00195 for (kk=0;kk<dsdp->ncones;kk++){ 00196 DSDPEventLogBegin(dsdp->K[kk].coneid); 00197 info=DSDPConeMultiplyAdd(dsdp->K[kk].cone,dsdp->schurmu,vrow,v,vv);DSDPCHKCONEERR(kk,info); 00198 DSDPEventLogEnd(dsdp->K[kk].coneid); 00199 } 00200 info=DSDPSchurMatReducePVec(dsdp->M,vv);DSDPCHKERR(info); 00201 DSDPEventLogEnd(ConeHMultiplyAdd); 00202 DSDPFunctionReturn(0); 00203 } 00204 00205 #undef __FUNCT__ 00206 #define __FUNCT__ "DSDPComputeG" 00207 00215 int DSDPComputeG( DSDP dsdp , DSDPVec vt, DSDPVec vrhs1, DSDPVec vrhs2){ 00216 int info,kk; double r; 00217 DSDPFunctionBegin; 00218 DSDPEventLogBegin(ConeRHS); 00219 info=DSDPVecZero(vrhs1);DSDPCHKERR(info); 00220 info=DSDPVecZero(vrhs2);DSDPCHKERR(info); 00221 info=DSDPVecGetR(dsdp->y,&r);DSDPCHKERR(info); 00222 info=DSDPSchurMatSetR(dsdp->M,r);DSDPCHKERR(info); 00223 info=DSDPSchurMatRowScaling(dsdp->M,vt);DSDPCHKERR(info); 00224 info=DSDPObjectiveGH(dsdp,dsdp->M,vrhs1); DSDPCHKERR(info); 00225 if (0 && r==0){info=DSDPVecSetR(vrhs1,0);info=DSDPVecSetR(vrhs2,0);} 00226 /* info=DSDPVecScale(1.0/dsdp->schurmu,vrhs1); DSDPCHKERR(info); */ 00227 for (kk=0;kk<dsdp->ncones;kk++){ 00228 DSDPEventLogBegin(dsdp->K[kk].coneid); 00229 info=DSDPConeComputeRHS(dsdp->K[kk].cone,dsdp->schurmu,vt,vrhs1,vrhs2);DSDPCHKCONEERR(kk,info); 00230 DSDPEventLogEnd(dsdp->K[kk].coneid); 00231 } 00232 DSDPEventLogEnd(ConeRHS); 00233 info=DSDPSchurMatReducePVec(dsdp->M,vrhs1);DSDPCHKERR(info); 00234 info=DSDPSchurMatReducePVec(dsdp->M,vrhs2);DSDPCHKERR(info); 00235 DSDPFunctionReturn(0); 00236 } 00237 00238 #undef __FUNCT__ 00239 #define __FUNCT__ "DSDPComputeANorm2" 00240 00246 int DSDPComputeANorm2( DSDP dsdp , DSDPVec Anorm2){ 00247 int info,kk; 00248 DSDPFunctionBegin; 00249 for (kk=0;kk<dsdp->ncones;kk++){ 00250 DSDPEventLogBegin(dsdp->K[kk].coneid); 00251 info=DSDPConeANorm2(dsdp->K[kk].cone,Anorm2);DSDPCHKCONEERR(kk,info); 00252 DSDPEventLogEnd(dsdp->K[kk].coneid); 00253 } 00254 DSDPFunctionReturn(0); 00255 } 00256 00257 00270 #undef __FUNCT__ 00271 #define __FUNCT__ "DSDPComputeSS" 00272 int DSDPComputeSS(DSDP dsdp, DSDPVec Y, DSDPDualFactorMatrix flag, DSDPTruth *ispsdefinite){ 00273 int info,kk; 00274 DSDPTruth psd=DSDP_TRUE; 00275 DSDPFunctionBegin; 00276 if (flag==DUAL_FACTOR){ 00277 DSDPEventLogBegin(ConeComputeS); 00278 } else if (flag==PRIMAL_FACTOR){ 00279 DSDPEventLogBegin(ConeComputeSS); 00280 } 00281 for (kk=dsdp->ncones-1; kk>=0 && psd==DSDP_TRUE;kk--){ 00282 DSDPEventLogBegin(dsdp->K[kk].coneid); 00283 info=DSDPConeComputeS(dsdp->K[kk].cone,Y,flag,&psd); DSDPCHKCONEERR(kk,info); 00284 DSDPEventLogEnd(dsdp->K[kk].coneid); 00285 } 00286 *ispsdefinite=psd; 00287 if (flag==DUAL_FACTOR){ 00288 DSDPEventLogEnd(ConeComputeS); 00289 } else if (flag==PRIMAL_FACTOR){ 00290 DSDPEventLogEnd(ConeComputeSS); 00291 } 00292 DSDPFunctionReturn(0); 00293 } 00294 00305 #undef __FUNCT__ 00306 #define __FUNCT__ "DSDPInvertS" 00307 int DSDPInvertS(DSDP dsdp){ 00308 int info,kk; 00309 DSDPFunctionBegin; 00310 DSDPEventLogBegin(ConeInvertS); 00311 for (kk=0;kk<dsdp->ncones;kk++){ 00312 DSDPEventLogBegin(dsdp->K[kk].coneid); 00313 info=DSDPConeInvertS(dsdp->K[kk].cone); DSDPCHKCONEERR(kk,info); 00314 DSDPEventLogEnd(dsdp->K[kk].coneid); 00315 } 00316 DSDPEventLogEnd(ConeInvertS); 00317 DSDPFunctionReturn(0); 00318 } 00319 00334 #undef __FUNCT__ 00335 #define __FUNCT__ "DSDPComputeMaxStepLength" 00336 int DSDPComputeMaxStepLength(DSDP dsdp, DSDPVec DY, DSDPDualFactorMatrix flag, double *maxsteplength){ 00337 int info,kk; 00338 double msteplength=1.0e30,conesteplength; 00339 DSDPFunctionBegin; 00340 if (flag==DUAL_FACTOR){ 00341 DSDPEventLogBegin(ConeMaxDStep); 00342 } else if (flag==PRIMAL_FACTOR){ 00343 DSDPEventLogBegin(ConeMaxPStep); 00344 } 00345 for (kk=0;kk<dsdp->ncones;kk++){ 00346 DSDPEventLogBegin(dsdp->K[kk].coneid); 00347 conesteplength=1.0e20; 00348 info=DSDPConeComputeMaxStepLength(dsdp->K[kk].cone,DY,flag,&conesteplength);DSDPCHKCONEERR(kk,info); 00349 msteplength=DSDPMin(msteplength,conesteplength); 00350 DSDPEventLogEnd(dsdp->K[kk].coneid); 00351 } 00352 *maxsteplength=msteplength; 00353 if (flag==DUAL_FACTOR){ 00354 DSDPEventLogEnd(ConeMaxDStep); 00355 } else if (flag==PRIMAL_FACTOR){ 00356 DSDPEventLogEnd(ConeMaxPStep); 00357 } 00358 DSDPFunctionReturn(0); 00359 } 00360 00361 00376 #undef __FUNCT__ 00377 #define __FUNCT__ "DSDPPassXVectors" 00378 int DSDPPassXVectors(DSDP dsdp, double mu, DSDPVec Y, DSDPVec DY){ 00379 int info,kk; 00380 DSDPFunctionBegin; 00381 for (kk=0;kk<dsdp->ncones;kk++){ 00382 DSDPEventLogBegin(dsdp->K[kk].coneid); 00383 info=DSDPConeSetXMaker(dsdp->K[kk].cone,mu,Y,DY);DSDPCHKCONEERR(kk,info); 00384 DSDPEventLogEnd(dsdp->K[kk].coneid); 00385 } 00386 DSDPFunctionReturn(0); 00387 } 00388 00389 00399 #undef __FUNCT__ 00400 #define __FUNCT__ "DSDPGetConicDimension" 00401 int DSDPGetConicDimension(DSDP dsdp, double *n){ 00402 int info,kk; 00403 double nn,nnn=0; 00404 DSDPFunctionBegin; 00405 for (kk=0;kk<dsdp->ncones;kk++){ 00406 nn=0; 00407 info=DSDPConeGetDimension(dsdp->K[kk].cone,&nn);DSDPCHKCONEERR(kk,info); 00408 nnn+=nn; 00409 } 00410 *n=nnn; 00411 DSDPFunctionReturn(0); 00412 } 00413 00414 00422 #undef __FUNCT__ 00423 #define __FUNCT__ "DSDPViewCones" 00424 int DSDPViewCones(DSDP dsdp){ 00425 int info,kk; 00426 DSDPFunctionBegin; 00427 DSDPEventLogBegin(ConeView); 00428 for (kk=0;kk<dsdp->ncones;kk++){ 00429 DSDPEventLogBegin(dsdp->K[kk].coneid); 00430 info=DSDPConeView(dsdp->K[kk].cone);DSDPCHKCONEERR(kk,info); 00431 DSDPEventLogEnd(dsdp->K[kk].coneid); 00432 } 00433 DSDPEventLogEnd(ConeView); 00434 DSDPFunctionReturn(0); 00435 } 00436 00437 00448 #undef __FUNCT__ 00449 #define __FUNCT__ "DSDPMonitorCones" 00450 int DSDPMonitorCones(DSDP dsdp,int tag){ 00451 int info,kk; 00452 DSDPFunctionBegin; 00453 DSDPEventLogBegin(ConeView); 00454 for (kk=0;kk<dsdp->ncones;kk++){ 00455 DSDPEventLogBegin(dsdp->K[kk].coneid); 00456 info=DSDPConeMonitor(dsdp->K[kk].cone,tag);DSDPCHKCONEERR(kk,info); 00457 DSDPEventLogEnd(dsdp->K[kk].coneid); 00458 } 00459 DSDPEventLogEnd(ConeView); 00460 DSDPFunctionReturn(0); 00461 } 00462 00463 00472 #undef __FUNCT__ 00473 #define __FUNCT__ "DSDPSparsityInSchurMat" 00474 int DSDPSchurSparsity(DSDP dsdp, int row, int rnnz[], int m){ 00475 int info,kk; 00476 DSDPFunctionBegin; 00477 for (kk=0;kk<dsdp->ncones;kk++){ 00478 /* DSDPEventLogBegin(dsdp->K[kk].coneid); */ 00479 info=DSDPConeSparsityInSchurMat(dsdp->K[kk].cone,row,rnnz,m+2);DSDPCHKCONEERR(kk,info); 00480 /* DSDPEventLogEnd(dsdp->K[kk].coneid); */ 00481 } 00482 DSDPFunctionReturn(0); 00483 } 00484 00493 #undef __FUNCT__ 00494 #define __FUNCT__ "DSDPComputeLogSDeterminant" 00495 int DSDPComputeLogSDeterminant(DSDP dsdp, double *logdet){ 00496 int info,kk; 00497 double coneobjective,conepotential,llogdet=0; 00498 DSDPFunctionBegin; 00499 DSDPEventLogBegin(ConePotential); 00500 for (kk=0;kk<dsdp->ncones;kk++){ 00501 DSDPEventLogBegin(dsdp->K[kk].coneid); 00502 coneobjective=0;conepotential=0; 00503 info=DSDPConeComputeLogSDeterminant(dsdp->K[kk].cone,&coneobjective,&conepotential);DSDPCHKCONEERR(kk,info); 00504 llogdet+=conepotential; 00505 DSDPEventLogEnd(dsdp->K[kk].coneid); 00506 } 00507 *logdet=llogdet; 00508 DSDPEventLogEnd(ConePotential); 00509 DSDPFunctionReturn(0); 00510 } 00511 00512 00520 #undef __FUNCT__ 00521 #define __FUNCT__ "DSDPSetCone" 00522 int DSDPSetCone(DSDP dsdp,DSDPCone tcone){ 00523 int info,i,tc; 00524 char conename[100]; 00525 DCone *ccones; 00526 DSDPFunctionBegin; 00527 if (dsdp->ncones>=dsdp->maxcones){ 00528 tc=2*dsdp->maxcones+4; 00529 00530 DSDPCALLOC2(&ccones,DCone,tc,&info);DSDPCHKERR(info); 00531 for (i=0;i<dsdp->ncones;i++){ccones[i].cone=dsdp->K[i].cone;} 00532 for (i=0;i<dsdp->ncones;i++){ccones[i].coneid=dsdp->K[i].coneid;} 00533 DSDPFREE(&dsdp->K,&info);DSDPCHKERR(info); 00534 dsdp->K=ccones; 00535 dsdp->maxcones=tc; 00536 } 00537 info=DSDPGetConeName(tcone,conename,100);DSDPCHKERR(info); 00538 DSDPEventLogRegister(conename,&tc); 00539 dsdp->K[dsdp->ncones].cone=tcone; 00540 dsdp->K[dsdp->ncones].coneid=tc; 00541 dsdp->ncones++; 00542 DSDPFunctionReturn(0); 00543 } 00544 00567 #undef __FUNCT__ 00568 #define __FUNCT__ "DSDPAddCone" 00569 int DSDPAddCone(DSDP dsdp,struct DSDPCone_Ops* dsdpops, void* dsdpcone){ 00570 int info; 00571 DSDPCone K; 00572 DSDPFunctionBegin; 00573 info=DSDPConeInitialize(&K); DSDPCHKERR(info); 00574 info=DSDPConeSetData(&K,dsdpops,dsdpcone); DSDPCHKERR(info); 00575 info=DSDPSetCone(dsdp,K); DSDPCHKERR(info); 00576 DSDPFunctionReturn(0); 00577 } 00578 00579 00600 #undef __FUNCT__ 00601 #define __FUNCT__ "DSDPSetSchurMatOps" 00602 int DSDPSetSchurMatOps(DSDP dsdp,struct DSDPSchurMat_Ops* sops, void* mdata){ 00603 int info; 00604 DSDPFunctionBegin; 00605 info=DSDPSchurMatSetData(&dsdp->M,sops,mdata);DSDPCHKERR(info); 00606 DSDPFunctionReturn(0); 00607 } 00608 00609 00620 #undef __FUNCT__ 00621 #define __FUNCT__ "DSDPSetSchurRow" 00622 int DSDPAddSchurRow(DSDP dsdp,int row, DSDPVec R){ 00623 int info; 00624 DSDPFunctionBegin; 00625 info=DSDPSchurMatAddRow(dsdp->M,row,1.0,R);DSDPCHKERR(info); 00626 DSDPFunctionReturn(0); 00627 } 00628 /* 00629 #undef __FUNCT__ 00630 #define __FUNCT__ "DSDPIdentifySchurColumns" 00631 int DSDPIdentifySchurColumns(DSDP dsdp,int row, int *mcol, int *ncols, int m){ 00632 DSDPFunctionBegin; 00633 int info; 00634 DSDPVec V; 00635 info=DSDPSchurMatRowColumnScaling(dsdp->M,row,V,ncols); DSDPCHKERR(info); 00636 DSDPFunctionReturn(1); 00637 } 00638 */ 00639 00652 #undef __FUNCT__ 00653 #define __FUNCT__ "DSDPComputeXVariables" 00654 int DSDPComputeXVariables(DSDP dsdp, double xmakermu, DSDPVec xmakery, DSDPVec xmakerdy, DSDPVec AX, double *tracexs){ 00655 int kk,info; 00656 double ttracexs=0,tttracexs=0,tracex; 00657 00658 DSDPFunctionBegin; 00659 DSDPEventLogBegin(ConeComputeX); 00660 info=DSDPVecZero(AX);DSDPCHKERR(info); 00661 for (kk=0;kk<dsdp->ncones;kk++){ 00662 DSDPEventLogBegin(dsdp->K[kk].coneid); 00663 tttracexs=0; 00664 info=DSDPConeComputeX(dsdp->K[kk].cone,xmakermu,xmakery,xmakerdy,AX,&tttracexs);DSDPCHKCONEERR(kk,info); 00665 ttracexs+=tttracexs; 00666 DSDPEventLogEnd(dsdp->K[kk].coneid); 00667 } 00668 info=DSDPVecGetR(AX,&tracex); DSDPCHKERR(info); 00669 DSDPLogInfo(0,2,"Trace(X): %4.2e\n",dsdp->tracex); 00670 info=DSDPVecAXPY(-1.0,dsdp->b,AX); DSDPCHKERR(info); 00671 info=DSDPComputeFixedYX(dsdp->M,AX); DSDPCHKERR(info); 00672 *tracexs=ttracexs; 00673 info=DSDPVecSetR(AX,tracex); DSDPCHKERR(info); 00674 DSDPEventLogEnd(ConeComputeX); 00675 DSDPFunctionReturn(0); 00676 } 00677 00678