<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <title>DSDP: src/solver/dsdpx.c Source File</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> <link href="doxygen.css" rel="stylesheet" type="text/css"/> </head> <body> <!-- Generated by Doxygen 1.7.4 --> <div id="top"> <div id="titlearea"> <table cellspacing="0" cellpadding="0"> <tbody> <tr style="height: 56px;"> <td style="padding-left: 0.5em;"> <div id="projectname">DSDP</div> </td> </tr> </tbody> </table> </div> <div id="navrow1" class="tabs"> <ul class="tablist"> <li><a href="index.html"><span>Main Page</span></a></li> <li><a href="pages.html"><span>Related Pages</span></a></li> <li><a href="modules.html"><span>Modules</span></a></li> <li><a href="annotated.html"><span>Data Structures</span></a></li> <li class="current"><a href="files.html"><span>Files</span></a></li> <li><a href="dirs.html"><span>Directories</span></a></li> </ul> </div> <div id="navrow2" class="tabs2"> <ul class="tablist"> <li><a href="files.html"><span>File List</span></a></li> <li><a href="globals.html"><span>Globals</span></a></li> </ul> </div> <div id="nav-path" class="navpath"> <ul> <li class="navelem"><a class="el" href="dir_23046874d7fed141927c769a66d8e3a5.html">src</a> </li> <li class="navelem"><a class="el" href="dir_03c647d51c93e018646ff83aa2eeb169.html">solver</a> </li> </ul> </div> </div> <div class="header"> <div class="headertitle"> <div class="title">dsdpx.c</div> </div> </div> <div class="contents"> <a href="dsdpx_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="preprocessor">#include "<a class="code" href="dsdp_8h.html" title="Internal data structure for the DSDP solver.">dsdp.h</a>"</span> <a name="l00002"></a>00002 <span class="preprocessor">#include "<a class="code" href="dsdpsys_8h.html" title="Error handling, printing, and profiling.">dsdpsys.h</a>"</span> <a name="l00003"></a>00003 <span class="preprocessor">#include "<a class="code" href="dsdp5_8h.html" title="The API to DSDP for those applications using DSDP as a subroutine library.">dsdp5.h</a>"</span> <a name="l00009"></a>00009 <span class="preprocessor">#undef __FUNCT__ </span> <a name="l00010"></a>00010 <span class="preprocessor"></span><span class="preprocessor">#define __FUNCT__ "DSDPInspectXY"</span> <a name="l00011"></a>00011 <span class="preprocessor"></span><span class="keywordtype">int</span> DSDPInspectXY(<a class="code" href="structDSDP__C.html" title="Internal structures for the DSDP solver.">DSDP</a> dsdp, <span class="keywordtype">double</span> xmakermu, <a class="code" href="dsdpvec_8h.html#a421243d35437ad44ded3c1e34198e8e9" title="This object hold m+2 variables: a scaling of C, the y variables, and r.">DSDPVec</a> xmakery, <a class="code" href="dsdpvec_8h.html#a421243d35437ad44ded3c1e34198e8e9" title="This object hold m+2 variables: a scaling of C, the y variables, and r.">DSDPVec</a> xmakerdy, <a class="code" href="dsdpvec_8h.html#a421243d35437ad44ded3c1e34198e8e9" title="This object hold m+2 variables: a scaling of C, the y variables, and r.">DSDPVec</a> AX, <span class="keywordtype">double</span> *tracexs2, <span class="keywordtype">double</span> *pobj2, <span class="keywordtype">double</span> *rpinfeas2){ <a name="l00012"></a>00012 <span class="keywordtype">int</span> info; <a name="l00013"></a>00013 DSDPFunctionBegin; <a name="l00014"></a>00014 <a name="l00015"></a>00015 info=BoundYConeAddX(dsdp->ybcone,xmakermu,xmakery,xmakerdy,AX,tracexs2); DSDPCHKERR(info); <a name="l00016"></a>00016 info=DSDPVecGetC(AX,pobj2);DSDPCHKERR(info); <a name="l00017"></a>00017 <a name="l00018"></a>00018 info=DSDPVecSetC(AX,0);DSDPCHKERR(info); <a name="l00019"></a>00019 info=DSDPVecSetR(AX,0);DSDPCHKERR(info); <a name="l00020"></a>00020 info=DSDPVecNorm1(AX,rpinfeas2); DSDPCHKERR(info); <a name="l00021"></a>00021 DSDPFunctionReturn(0); <a name="l00022"></a>00022 } <a name="l00023"></a>00023 <a name="l00053"></a>00053 <span class="preprocessor">#undef __FUNCT__ </span> <a name="l00054"></a>00054 <span class="preprocessor"></span><span class="preprocessor">#define __FUNCT__ "DSDPComputeX"</span> <a name="l00055"></a><a class="code" href="group__DSDPBasic.html#gacd271769549030ce365597101946220b">00055</a> <span class="preprocessor"></span><span class="keywordtype">int</span> <a class="code" href="group__DSDPBasic.html#gacd271769549030ce365597101946220b" title="Compute the X variables.">DSDPComputeX</a>(<a class="code" href="structDSDP__C.html" title="Internal structures for the DSDP solver.">DSDP</a> dsdp){ <a name="l00056"></a>00056 <span class="keywordtype">int</span> i,info; <a name="l00057"></a>00057 <span class="keywordtype">double</span> pobj=0,ppobj2=0,ddobj,tracexs=0,tracexs2=0,rpinfeas=0,rpinfeas2=0,rpobjerr=0; <a name="l00058"></a>00058 <span class="keywordtype">double</span> err1,cc,rrr,bigM,ymax,pfeastol=dsdp->pinfeastol; <a name="l00059"></a>00059 <a class="code" href="dsdpbasictypes_8h.html#a2a68c4cccb1289043bf9b59a58f55b3a" title="There are many reasons to terminate the solver.">DSDPTerminationReason</a> reason; <a name="l00060"></a>00060 <a class="code" href="dsdpvec_8h.html#a421243d35437ad44ded3c1e34198e8e9" title="This object hold m+2 variables: a scaling of C, the y variables, and r.">DSDPVec</a> AX=dsdp->ytemp; <a name="l00061"></a>00061 <a name="l00062"></a>00062 DSDPFunctionBegin; <a name="l00063"></a>00063 info=<a class="code" href="group__DSDPConverge.html#ga637bf541e030c5aef4d436a9792714a2" title="Copy the reason why the solver terminated.">DSDPStopReason</a>(dsdp,&reason);DSDPCHKERR(info); <a name="l00064"></a>00064 info=<a class="code" href="group__DSDPSolution.html#gadb9e055ef8b2194ae67ed14ca06f1d01" title="Copy the objective value (DD).">DSDPGetDDObjective</a>(dsdp,&ddobj);DSDPCHKERR(info); <a name="l00065"></a>00065 info=<a class="code" href="group__DSDPSolution.html#gae2e8b2a5e1b71d699d753a045de95add" title="Copy the the infinity norm of the variables y.">DSDPGetMaxYElement</a>(dsdp,&ymax);DSDPCHKERR(info); <a name="l00066"></a>00066 info=<a class="code" href="group__DSDPSolution.html#gacfa8e29ecd7eaaeb6a4e31eb07961de3" title="Copy the infeasibility in (D), or the variable r in (DD).">DSDPGetR</a>(dsdp,&rrr); DSDPCHKERR(info); <a name="l00067"></a>00067 info=DSDPGetPenalty(dsdp,&bigM);DSDPCHKERR(info); <a name="l00068"></a>00068 info=<a class="code" href="group__DSDPSolver.html#ga89e093b87698c2524d27fd97a8cbd3f6" title="Copy the internal scaling factor from the solver.">DSDPGetScale</a>(dsdp,&cc);DSDPCHKERR(info); <a name="l00069"></a>00069 <a name="l00070"></a>00070 dsdp->pdfeasible=<a class="code" href="dsdpbasictypes_8h.html#a7c124046b4ddae3d637157242af2df90a6ebc36bcf5037f059ae5e9014e76cee0">DSDP_PDFEASIBLE</a>; <a name="l00071"></a>00071 <span class="keywordflow">for</span> (i=0;i<MAX_XMAKERS;i++){ <a name="l00072"></a>00072 <span class="keywordflow">if</span> (i>0 && dsdp->xmaker[i].pstep<1) <span class="keywordflow">continue</span>; <a name="l00073"></a>00073 info=<a class="code" href="dsdp_8h.html#a871c5d28852a40e2593f75e635855296" title="Compute the X variables in each cone.">DSDPComputeXVariables</a>(dsdp,dsdp->xmaker[i].mu,dsdp->xmaker[i].y,dsdp->xmaker[i].dy,AX,&tracexs);DSDPCHKERR(info); <a name="l00074"></a>00074 info=DSDPVecGetC(AX,&pobj); DSDPCHKERR(info); <a name="l00075"></a>00075 info=DSDPVecGetR(AX,&dsdp->tracex); DSDPCHKERR(info); <a name="l00076"></a>00076 info=DSDPVecSetC(AX,0);DSDPCHKERR(info); <a name="l00077"></a>00077 info=DSDPVecSetR(AX,0);DSDPCHKERR(info); <a name="l00078"></a>00078 info=DSDPVecNormInfinity(AX,&rpinfeas);DSDPCHKERR(info); <a name="l00079"></a>00079 rpinfeas=rpinfeas/(dsdp->tracex+1); <a name="l00080"></a>00080 <a name="l00081"></a>00081 DSDPLogInfo(0,2,<span class="stringliteral">"POBJ: %4.4e, DOBJ: %4.4e\n"</span>,pobj,ddobj/cc); <a name="l00082"></a>00082 <a name="l00083"></a>00083 info=DSDPVecNorm2(AX,&err1);DSDPCHKERR(info); <a name="l00084"></a>00084 dsdp->tracexs=tracexs; <a name="l00085"></a>00085 dsdp->perror=err1; <a name="l00086"></a>00086 dsdp->pobj=cc*pobj; <a name="l00087"></a>00087 <a name="l00088"></a>00088 info=DSDPInspectXY(dsdp,dsdp->xmaker[i].mu,dsdp->xmaker[i].y,dsdp->xmaker[i].dy,AX,&tracexs2,&ppobj2,&rpinfeas2);DSDPCHKERR(info); <a name="l00089"></a>00089 rpinfeas2=rpinfeas2/(dsdp->tracex+1); <a name="l00090"></a>00090 <span class="comment">/* rpinfeas is infeasibility of (P) while rpinfeas2 is infeasibility of (PP) */</span> <a name="l00091"></a>00091 <a name="l00092"></a>00092 DSDPLogInfo(0,2,<span class="stringliteral">"X P Infeas: %4.2e , PObj: %4.8e\n"</span>,rpinfeas,pobj*(cc)); <a name="l00093"></a>00093 DSDPLogInfo(0,2,<span class="stringliteral">"TOTAL P Infeas: %4.2e PObj: %4.8e\n"</span>,rpinfeas2,ppobj2*(cc)); <a name="l00094"></a>00094 rpobjerr= fabs(pobj-dsdp->ppobj)/(1+fabs(dsdp->ppobj)); <a name="l00095"></a>00095 <a name="l00096"></a>00096 <span class="keywordflow">if</span> (rpinfeas2 < pfeastol){ <span class="comment">/* (PP) must be close to feasible */</span> <a name="l00097"></a>00097 <a name="l00098"></a>00098 <span class="keywordflow">if</span> (dsdp->rgap<0.1){ <a name="l00099"></a>00099 <span class="keywordflow">if</span> (rpinfeas>pfeastol/100 && fabs(rrr)>dsdp->dinfeastol){ <a name="l00100"></a>00100 dsdp->pdfeasible=<a class="code" href="dsdpbasictypes_8h.html#a7c124046b4ddae3d637157242af2df90a7dfad20f823f952f1442144a8fa5c208">DSDP_PDUNKNOWN</a>; <a name="l00101"></a>00101 DSDPLogInfo(0,2,<span class="stringliteral">"Warning: Try Increasing penalty parameter\n"</span>); <a name="l00102"></a>00102 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (rpinfeas>pfeastol && ddobj>0 && ppobj2<0 && fabs(rrr)<dsdp->dinfeastol){ <a name="l00103"></a>00103 dsdp->pdfeasible=<a class="code" href="dsdpbasictypes_8h.html#a7c124046b4ddae3d637157242af2df90a0008f194b20fc02f61eca61fab25ed05">DSDP_UNBOUNDED</a>; <a name="l00104"></a>00104 DSDPLogInfo(0,2,<span class="stringliteral">"Warning: D probably unbounded\n"</span>); <a name="l00105"></a>00105 <a name="l00106"></a>00106 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="comment">/* fabs(bigM)-dsdp->tracex < fabs(rrr) && rpinfeas<pfeastol */</span> fabs(rrr)>dsdp->dinfeastol){ <a name="l00107"></a>00107 dsdp->pdfeasible=<a class="code" href="dsdpbasictypes_8h.html#a7c124046b4ddae3d637157242af2df90abb5750f090ec5d7e1d8c1aead6565a52">DSDP_INFEASIBLE</a>; <a name="l00108"></a>00108 DSDPLogInfo(0,2,<span class="stringliteral">"Warning: D probably infeasible \n"</span>); <a name="l00109"></a>00109 } <a name="l00110"></a>00110 } <a name="l00111"></a>00111 i=i+10; <a name="l00112"></a>00112 <span class="keywordflow">break</span>; <a name="l00113"></a>00113 <a name="l00114"></a>00114 } <span class="keywordflow">else</span> { <a name="l00115"></a>00115 <span class="comment">/* Step direction was not accurate enough to compute X from Schur complement */</span> <a name="l00116"></a>00116 DSDPLogInfo(0,2,<span class="stringliteral">"Try backup X\n"</span>); <a name="l00117"></a>00117 info=<a class="code" href="group__DSDPConverge.html#ga1293e76a2fb57bd963713c3df7e88221" title="Monitor each iteration of the solver.">DSDPSetConvergenceFlag</a>(dsdp,<a class="code" href="dsdpbasictypes_8h.html#a2a68c4cccb1289043bf9b59a58f55b3aafd547daf59da4b0986d7894d38d3d269">DSDP_NUMERICAL_ERROR</a>); DSDPCHKERR(info); <a name="l00118"></a>00118 } <a name="l00119"></a>00119 <a name="l00120"></a>00120 } <a name="l00121"></a>00121 <a name="l00122"></a>00122 DSDPFunctionReturn(0); <a name="l00123"></a>00123 } <a name="l00124"></a>00124 <a name="l00125"></a>00125 <a name="l00126"></a>00126 <span class="preprocessor">#undef __FUNCT__</span> <a name="l00127"></a>00127 <span class="preprocessor"></span><span class="preprocessor">#define __FUNCT__ "DSDPSaveBackupYForX"</span> <a name="l00128"></a>00128 <span class="preprocessor"></span><span class="keywordtype">int</span> DSDPSaveBackupYForX(<a class="code" href="structDSDP__C.html" title="Internal structures for the DSDP solver.">DSDP</a> dsdp, <span class="keywordtype">int</span> count,<span class="keywordtype">double</span> mu, <span class="keywordtype">double</span> pstep){ <a name="l00129"></a>00129 <span class="keywordtype">int</span> info; <a name="l00130"></a>00130 <span class="keywordtype">double</span> pnorm; <a name="l00131"></a>00131 DSDPFunctionBegin; <a name="l00132"></a>00132 info=DSDPVecCopy(dsdp->y,dsdp->xmaker[count].y);DSDPCHKERR(info); <a name="l00133"></a>00133 info=<a class="code" href="dsdp_8h.html#ab857999f0834880cea633350bd673f2e" title="Compute the step direction.">DSDPComputeDY</a>(dsdp,mu,dsdp->xmaker[count].dy,&pnorm); DSDPCHKERR(info); <a name="l00134"></a>00134 dsdp->xmaker[count].pstep=pstep; <a name="l00135"></a>00135 dsdp->xmaker[count].mu = mu; <a name="l00136"></a>00136 DSDPFunctionReturn(0); <a name="l00137"></a>00137 } <a name="l00138"></a>00138 <a name="l00147"></a>00147 <span class="preprocessor">#undef __FUNCT__</span> <a name="l00148"></a>00148 <span class="preprocessor"></span><span class="preprocessor">#define __FUNCT__ "DSDPSaveYForX"</span> <a name="l00149"></a><a class="code" href="dsdpx_8c.html#a0ca67c8b05fac8e7c8b32340dd435b81">00149</a> <span class="preprocessor"></span><span class="keywordtype">int</span> <a class="code" href="dsdp_8h.html#acd704d80e2686ff321f3a63bc3c3b63f" title="Save the current solution for later computation of X.">DSDPSaveYForX</a>(<a class="code" href="structDSDP__C.html" title="Internal structures for the DSDP solver.">DSDP</a> dsdp, <span class="keywordtype">double</span> mu, <span class="keywordtype">double</span> pstep){ <a name="l00150"></a>00150 <span class="keywordtype">int</span> info,isgood=0; <a name="l00151"></a>00151 <span class="keywordtype">double</span> pnorm,newgap,ymax,dd=0; <a name="l00152"></a>00152 DSDPFunctionBegin; <a name="l00153"></a>00153 dsdp->pstepold=dsdp->pstep; <a name="l00154"></a>00154 info=<a class="code" href="group__DSDPSolution.html#gae2e8b2a5e1b71d699d753a045de95add" title="Copy the the infinity norm of the variables y.">DSDPGetMaxYElement</a>(dsdp,&ymax);DSDPCHKERR(info); <a name="l00155"></a>00155 <span class="keywordflow">if</span> (pstep==0){ <a name="l00156"></a>00156 info=DSDPVecCopy(dsdp->y,dsdp->xmaker[0].y);DSDPCHKERR(info); <a name="l00157"></a>00157 dsdp->xmaker[0].pstep=pstep; <a name="l00158"></a>00158 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dsdp->Mshift*ymax>dsdp->pinfeastol*10){ <a name="l00159"></a>00159 info=<a class="code" href="dsdp_8h.html#a5cad8f283551874464395089d3aa76b0" title="Compute the current duality gap.">DSDPComputeDualityGap</a>(dsdp,mu,&newgap);DSDPCHKERR(info); <a name="l00160"></a>00160 <span class="keywordflow">if</span> (pstep==1 && newgap>0){ <a name="l00161"></a>00161 dsdp->ppobj = dsdp->ddobj + newgap; dsdp->mu=(newgap)/(dsdp->np); <a name="l00162"></a>00162 dsdp->dualitygap=newgap; <a name="l00163"></a>00163 } <a name="l00164"></a>00164 info=DSDPVecZero(dsdp->rhstemp); DSDPCHKERR(info); <a name="l00165"></a>00165 info=BoundYConeAddX(dsdp->ybcone,dsdp->xmaker[0].mu,dsdp->xmaker[0].y,dsdp->xmaker[0].dy,dsdp->rhstemp,&dd); DSDPCHKERR(info); <a name="l00166"></a>00166 info=DSDPVecSetC(dsdp->rhstemp,0); <a name="l00167"></a>00167 info=DSDPVecSetR(dsdp->rhstemp,0); <a name="l00168"></a>00168 info=DSDPVecNormInfinity(dsdp->rhstemp,&dsdp->pinfeas); DSDPCHKERR(info); <a name="l00169"></a>00169 dsdp->pinfeas+=dsdp->Mshift*ymax; <a name="l00170"></a>00170 <span class="keywordflow">if</span> (0==1){info=DSDPVecView(dsdp->rhstemp);} <a name="l00171"></a>00171 <span class="comment">/* Not good enough to save */</span> <a name="l00172"></a>00172 } <span class="keywordflow">else</span> { <a name="l00173"></a>00173 info=DSDPVecCopy(dsdp->y,dsdp->xmaker[0].y);DSDPCHKERR(info); <a name="l00174"></a>00174 dsdp->xmaker[0].pstep=pstep; <a name="l00175"></a>00175 info=<a class="code" href="dsdp_8h.html#a2291b15b24f36be603dbca274db5997f" title="Compute the right-hand side of the linear system that determines the step direction.">DSDPComputeRHS</a>(dsdp,mu,dsdp->xmakerrhs); DSDPCHKERR(info); <a name="l00176"></a>00176 info=<a class="code" href="dsdp_8h.html#ab857999f0834880cea633350bd673f2e" title="Compute the step direction.">DSDPComputeDY</a>(dsdp,mu,dsdp->xmaker[0].dy,&pnorm); DSDPCHKERR(info); <a name="l00177"></a>00177 dsdp->xmaker[0].mu = mu; <a name="l00178"></a>00178 info=<a class="code" href="dsdp_8h.html#a5cad8f283551874464395089d3aa76b0" title="Compute the current duality gap.">DSDPComputeDualityGap</a>(dsdp,mu,&newgap);DSDPCHKERR(info); <a name="l00179"></a>00179 <span class="keywordflow">if</span> (pstep==1 && newgap>0){ <a name="l00180"></a>00180 dsdp->ppobj = dsdp->ddobj + newgap; dsdp->mu=(newgap)/(dsdp->np); <a name="l00181"></a>00181 dsdp->dualitygap=newgap; <a name="l00182"></a>00182 <a name="l00183"></a>00183 info=DSDPVecZero(dsdp->rhstemp); DSDPCHKERR(info); <a name="l00184"></a>00184 info=BoundYConeAddX(dsdp->ybcone,dsdp->xmaker[0].mu,dsdp->xmaker[0].y,dsdp->xmaker[0].dy,dsdp->rhstemp,&dd); DSDPCHKERR(info); <a name="l00185"></a>00185 info=DSDPVecSetC(dsdp->rhstemp,0); <a name="l00186"></a>00186 info=DSDPVecSetR(dsdp->rhstemp,0); <a name="l00187"></a>00187 info=DSDPVecNormInfinity(dsdp->rhstemp,&dsdp->pinfeas); DSDPCHKERR(info); <a name="l00188"></a>00188 dsdp->pinfeas+=dsdp->Mshift*ymax; <a name="l00189"></a>00189 <span class="keywordflow">if</span> (0==1){info=DSDPVecView(dsdp->rhstemp);} <a name="l00190"></a>00190 <a name="l00191"></a>00191 } <a name="l00192"></a>00192 isgood=1; <a name="l00193"></a>00193 } <a name="l00194"></a>00194 <a name="l00195"></a>00195 <span class="keywordflow">if</span> (isgood==1){ <a name="l00196"></a>00196 <span class="keywordtype">double</span> penalty,r,rx; <a name="l00197"></a>00197 info=<a class="code" href="dsdp_8h.html#a4d28c58bb5605d6636c6a425c10bf9ea" title="Pass the information needed to compute the variables X in each cone but do not compute X...">DSDPPassXVectors</a>(dsdp,dsdp->xmaker[0].mu,dsdp->xmaker[0].y,dsdp->xmaker[0].dy); DSDPCHKERR(info); <a name="l00198"></a>00198 info=<a class="code" href="dsdp_8h.html#af433c52034d6fcfdafe637e66851808c" title="Get variable r.">DSDPGetRR</a>(dsdp,&r);DSDPCHKERR(info); <a name="l00199"></a>00199 <span class="keywordflow">if</span> (r&& dsdp->rgap<0.1){ <span class="comment">/* Estimate error in X */</span> <a name="l00200"></a>00200 info=RConeGetRX(dsdp->rcone,&rx);DSDPCHKERR(info); <a name="l00201"></a>00201 info=DSDPGetPenalty(dsdp,&penalty);DSDPCHKERR(info); <a name="l00202"></a>00202 dsdp->pinfeas = dsdp->pinfeas *(1+fabs(penalty-rx)); <a name="l00203"></a>00203 } <a name="l00204"></a>00204 } <a name="l00205"></a>00205 <a name="l00206"></a>00206 <span class="keywordflow">if</span> (pstep==1.0 && dsdp->rgap>5.0e-1) { <a name="l00207"></a>00207 info=DSDPSaveBackupYForX(dsdp,MAX_XMAKERS-1,mu,pstep);DSDPCHKERR(info); <a name="l00208"></a>00208 } <a name="l00209"></a>00209 <span class="keywordflow">if</span> (pstep==1.0 && dsdp->rgap>1.0e-3) { <a name="l00210"></a>00210 info=DSDPSaveBackupYForX(dsdp,2,mu,pstep);DSDPCHKERR(info); <a name="l00211"></a>00211 } <a name="l00212"></a>00212 <span class="keywordflow">if</span> (pstep==1.0 && dsdp->rgap>1.0e-5) { <a name="l00213"></a>00213 info=DSDPSaveBackupYForX(dsdp,1,mu,pstep);DSDPCHKERR(info); <a name="l00214"></a>00214 } <a name="l00215"></a>00215 <a name="l00216"></a>00216 DSDPFunctionReturn(0); <a name="l00217"></a>00217 } <a name="l00218"></a>00218 <a name="l00230"></a>00230 <span class="preprocessor">#undef __FUNCT__ </span> <a name="l00231"></a>00231 <span class="preprocessor"></span><span class="preprocessor">#define __FUNCT__ "DSDPGetPObjective"</span> <a name="l00232"></a><a class="code" href="group__DSDPSolution.html#ga0126bd2c9da5d8a7ca0806bd8dd8e56f">00232</a> <span class="preprocessor"></span><span class="keywordtype">int</span> <a class="code" href="group__DSDPSolution.html#ga0126bd2c9da5d8a7ca0806bd8dd8e56f" title="Copy the objective value (P).">DSDPGetPObjective</a>(<a class="code" href="structDSDP__C.html" title="Internal structures for the DSDP solver.">DSDP</a> dsdp,<span class="keywordtype">double</span> *pobj){ <a name="l00233"></a>00233 <span class="keywordtype">int</span> info; <a name="l00234"></a>00234 <span class="keywordtype">double</span> scale; <a name="l00235"></a>00235 DSDPFunctionBegin; <a name="l00236"></a>00236 DSDPValid(dsdp); <a name="l00237"></a>00237 info=<a class="code" href="group__DSDPSolver.html#ga89e093b87698c2524d27fd97a8cbd3f6" title="Copy the internal scaling factor from the solver.">DSDPGetScale</a>(dsdp,&scale);DSDPCHKERR(info); <a name="l00238"></a>00238 *pobj=(dsdp->pobj)/scale; <a name="l00239"></a>00239 DSDPFunctionReturn(0); <a name="l00240"></a>00240 } <a name="l00241"></a>00241 <a name="l00252"></a>00252 <span class="preprocessor">#undef __FUNCT__ </span> <a name="l00253"></a>00253 <span class="preprocessor"></span><span class="preprocessor">#define __FUNCT__ "DSDPGetSolutionType"</span> <a name="l00254"></a><a class="code" href="group__DSDPBasic.html#ga33e05559ab15ea40b1e9b31ecc206b3e">00254</a> <span class="preprocessor"></span><span class="keywordtype">int</span> <a class="code" href="group__DSDPBasic.html#ga33e05559ab15ea40b1e9b31ecc206b3e" title="Solutions can be bounded, infeasible, or unbounded.">DSDPGetSolutionType</a>(<a class="code" href="structDSDP__C.html" title="Internal structures for the DSDP solver.">DSDP</a> dsdp,<a class="code" href="dsdpbasictypes_8h.html#a7c124046b4ddae3d637157242af2df90" title="Formulations (P) and (D) can be feasible and bounded, feasible and unbounded, or infeasible.">DSDPSolutionType</a> *pdfeasible){ <a name="l00255"></a>00255 DSDPFunctionBegin; <a name="l00256"></a>00256 DSDPValid(dsdp); <a name="l00257"></a>00257 *pdfeasible=dsdp->pdfeasible; <a name="l00258"></a>00258 DSDPFunctionReturn(0); <a name="l00259"></a>00259 } <a name="l00276"></a>00276 <span class="preprocessor">#undef __FUNCT__ </span> <a name="l00277"></a>00277 <span class="preprocessor"></span><span class="preprocessor">#define __FUNCT__ "DSDPGetTraceX"</span> <a name="l00278"></a><a class="code" href="group__DSDPSolution.html#ga2580bcdac912b6477f067a8ccbc801bc">00278</a> <span class="preprocessor"></span><span class="keywordtype">int</span> <a class="code" href="group__DSDPSolution.html#ga2580bcdac912b6477f067a8ccbc801bc" title="Copy the trace of the variables X in (P).">DSDPGetTraceX</a>(<a class="code" href="structDSDP__C.html" title="Internal structures for the DSDP solver.">DSDP</a> dsdp, <span class="keywordtype">double</span> *tracex){ <a name="l00279"></a>00279 DSDPFunctionBegin; <a name="l00280"></a>00280 DSDPValid(dsdp); <a name="l00281"></a>00281 *tracex=dsdp->tracex; <a name="l00282"></a>00282 DSDPFunctionReturn(0); <a name="l00283"></a>00283 } <a name="l00284"></a>00284 <a name="l00295"></a>00295 <span class="preprocessor">#undef __FUNCT__ </span> <a name="l00296"></a>00296 <span class="preprocessor"></span><span class="preprocessor">#define __FUNCT__ "DSDPGetFinalErrors"</span> <a name="l00297"></a><a class="code" href="group__DSDPSolution.html#ga563ea95890673182c1de4252cf3e5309">00297</a> <span class="preprocessor"></span><span class="keywordtype">int</span> <a class="code" href="group__DSDPSolution.html#ga563ea95890673182c1de4252cf3e5309" title="Copy six different error measurements into an array.">DSDPGetFinalErrors</a>(<a class="code" href="structDSDP__C.html" title="Internal structures for the DSDP solver.">DSDP</a> dsdp, <span class="keywordtype">double</span> err[6]){ <a name="l00298"></a>00298 <span class="keywordtype">int</span> info; <a name="l00299"></a>00299 <span class="keywordtype">double</span> scale,rr,bnorm,dobj=0,pobj=0; <a name="l00300"></a>00300 DSDPFunctionBegin; <a name="l00301"></a>00301 DSDPValid(dsdp); <a name="l00302"></a>00302 info=<a class="code" href="group__DSDPSolver.html#ga89e093b87698c2524d27fd97a8cbd3f6" title="Copy the internal scaling factor from the solver.">DSDPGetScale</a>(dsdp,&scale);DSDPCHKERR(info); <a name="l00303"></a>00303 info=DSDPVecGetR(dsdp->y,&rr); DSDPCHKERR(info); <a name="l00304"></a>00304 info=<a class="code" href="group__DSDPSolution.html#ga0126bd2c9da5d8a7ca0806bd8dd8e56f" title="Copy the objective value (P).">DSDPGetPObjective</a>(dsdp,&pobj);DSDPCHKERR(info); <a name="l00305"></a>00305 info=<a class="code" href="group__DSDPSolution.html#ga2752cf39e1774945b484bddf7c2a5ef2" title="Copy the objective value (D).">DSDPGetDObjective</a>(dsdp,&dobj);DSDPCHKERR(info); <a name="l00306"></a>00306 err[0]=dsdp->perror; <a name="l00307"></a>00307 err[1]=0; <a name="l00308"></a>00308 err[2]=fabs(rr)/scale; <a name="l00309"></a>00309 err[3]=0; <a name="l00310"></a>00310 err[4]=pobj - dobj; <a name="l00311"></a>00311 err[5]=dsdp->tracexs/scale; <a name="l00312"></a>00312 <a name="l00313"></a>00313 err[2] /= (1.0+dsdp->cnorm); <a name="l00314"></a>00314 info=DSDPVecCopy(dsdp->b,dsdp->ytemp);DSDPCHKERR(info); <a name="l00315"></a>00315 info=DSDPVecSetC(dsdp->ytemp,0);DSDPCHKERR(info); <a name="l00316"></a>00316 info=DSDPVecSetR(dsdp->ytemp,0);DSDPCHKERR(info); <a name="l00317"></a>00317 info=DSDPVecNormInfinity(dsdp->ytemp,&bnorm); <a name="l00318"></a>00318 err[0]=dsdp->perror/(1.0+bnorm); <a name="l00319"></a>00319 <a name="l00320"></a>00320 err[4]=(err[4])/(1.0+fabs(pobj)+fabs(dobj)); <a name="l00321"></a>00321 err[5]=(err[5])/(1.0+fabs(pobj)+fabs(dobj)); <a name="l00322"></a>00322 DSDPFunctionReturn(0); <a name="l00323"></a>00323 } <a name="l00324"></a>00324 <a name="l00341"></a>00341 <span class="preprocessor">#undef __FUNCT__ </span> <a name="l00342"></a>00342 <span class="preprocessor"></span><span class="preprocessor">#define __FUNCT__ "DSDPGetPInfeasibility"</span> <a name="l00343"></a><a class="code" href="group__DSDPConverge.html#ga88aa3c65b2eb3699f6c2d203c3f11963">00343</a> <span class="preprocessor"></span><span class="keywordtype">int</span> <a class="code" href="group__DSDPConverge.html#ga88aa3c65b2eb3699f6c2d203c3f11963" title="Copy the infeasibility in (P).">DSDPGetPInfeasibility</a>(<a class="code" href="structDSDP__C.html" title="Internal structures for the DSDP solver.">DSDP</a> dsdp, <span class="keywordtype">double</span> *pperror){ <a name="l00344"></a>00344 DSDPFunctionBegin; <a name="l00345"></a>00345 DSDPValid(dsdp); <a name="l00346"></a>00346 <span class="keywordflow">if</span> (pperror) *pperror=dsdp->pinfeas; <a name="l00347"></a>00347 DSDPFunctionReturn(0); <a name="l00348"></a>00348 } <a name="l00349"></a>00349 <a name="l00363"></a>00363 <span class="preprocessor">#undef __FUNCT__ </span> <a name="l00364"></a>00364 <span class="preprocessor"></span><span class="preprocessor">#define __FUNCT__ "DSDPSetPTolerance"</span> <a name="l00365"></a><a class="code" href="group__DSDPConverge.html#gad0a3f0df89bd8b3e4b7fb1f6c738d330">00365</a> <span class="preprocessor"></span><span class="keywordtype">int</span> <a class="code" href="group__DSDPConverge.html#gad0a3f0df89bd8b3e4b7fb1f6c738d330" title="Classify (P) as feasible only if the infeasibility is less than this tolerance.">DSDPSetPTolerance</a>(<a class="code" href="structDSDP__C.html" title="Internal structures for the DSDP solver.">DSDP</a> dsdp,<span class="keywordtype">double</span> inftol){ <a name="l00366"></a>00366 DSDPFunctionBegin; <a name="l00367"></a>00367 DSDPValid(dsdp); <a name="l00368"></a>00368 <span class="keywordflow">if</span> (inftol > 0) dsdp->pinfeastol = inftol; <a name="l00369"></a>00369 DSDPLogInfo(0,2,<span class="stringliteral">"Set P Infeasibility Tolerance: %4.4e\n"</span>,inftol); <a name="l00370"></a>00370 DSDPFunctionReturn(0); <a name="l00371"></a>00371 } <a name="l00372"></a>00372 <a name="l00384"></a>00384 <span class="preprocessor">#undef __FUNCT__ </span> <a name="l00385"></a>00385 <span class="preprocessor"></span><span class="preprocessor">#define __FUNCT__ "DSDPGetPTolerance"</span> <a name="l00386"></a><a class="code" href="group__DSDPConverge.html#ga8c3bf97d823880a151321f7c7c43aaf8">00386</a> <span class="preprocessor"></span><span class="keywordtype">int</span> <a class="code" href="group__DSDPConverge.html#ga8c3bf97d823880a151321f7c7c43aaf8" title="Copy the feasibility tolerance.">DSDPGetPTolerance</a>(<a class="code" href="structDSDP__C.html" title="Internal structures for the DSDP solver.">DSDP</a> dsdp,<span class="keywordtype">double</span> *inftol){ <a name="l00387"></a>00387 DSDPFunctionBegin; <a name="l00388"></a>00388 DSDPValid(dsdp); <a name="l00389"></a>00389 <span class="keywordflow">if</span> (inftol) *inftol=dsdp->pinfeastol; <a name="l00390"></a>00390 DSDPFunctionReturn(0); <a name="l00391"></a>00391 } <a name="l00392"></a>00392 <a name="l00393"></a>00393 <a name="l00407"></a>00407 <span class="preprocessor">#undef __FUNCT__ </span> <a name="l00408"></a>00408 <span class="preprocessor"></span><span class="preprocessor">#define __FUNCT__ "DSDPSetRTolerance"</span> <a name="l00409"></a><a class="code" href="group__DSDPConverge.html#ga8fa9a4a362aaa64e12538a55f215e8ce">00409</a> <span class="preprocessor"></span><span class="keywordtype">int</span> <a class="code" href="group__DSDPConverge.html#ga8fa9a4a362aaa64e12538a55f215e8ce" title="Classify (D) as feasible only if the variable r is less than this tolerance.">DSDPSetRTolerance</a>(<a class="code" href="structDSDP__C.html" title="Internal structures for the DSDP solver.">DSDP</a> dsdp,<span class="keywordtype">double</span> inftol){ <a name="l00410"></a>00410 DSDPFunctionBegin; <a name="l00411"></a>00411 DSDPValid(dsdp); <a name="l00412"></a>00412 <span class="keywordflow">if</span> (inftol > 0) dsdp->dinfeastol = inftol; <a name="l00413"></a>00413 DSDPLogInfo(0,2,<span class="stringliteral">"Set D Infeasibility Tolerance: %4.4e\n"</span>,inftol); <a name="l00414"></a>00414 DSDPFunctionReturn(0); <a name="l00415"></a>00415 } <a name="l00416"></a>00416 <a name="l00432"></a>00432 <span class="preprocessor">#undef __FUNCT__ </span> <a name="l00433"></a>00433 <span class="preprocessor"></span><span class="preprocessor">#define __FUNCT__ "DSDPGetRTolerance"</span> <a name="l00434"></a><a class="code" href="group__DSDPConverge.html#ga48cc08979850c048b38d7f1fd423deec">00434</a> <span class="preprocessor"></span><span class="keywordtype">int</span> <a class="code" href="group__DSDPConverge.html#ga48cc08979850c048b38d7f1fd423deec" title="Copy the maximum infeasibility allowed (D).">DSDPGetRTolerance</a>(<a class="code" href="structDSDP__C.html" title="Internal structures for the DSDP solver.">DSDP</a> dsdp,<span class="keywordtype">double</span> *inftol){ <a name="l00435"></a>00435 DSDPFunctionBegin; <a name="l00436"></a>00436 DSDPValid(dsdp); <a name="l00437"></a>00437 *inftol=dsdp->dinfeastol; <a name="l00438"></a>00438 DSDPFunctionReturn(0); <a name="l00439"></a>00439 } <a name="l00440"></a>00440 <a name="l00453"></a>00453 <span class="preprocessor">#undef __FUNCT__ </span> <a name="l00454"></a>00454 <span class="preprocessor"></span><span class="preprocessor">#define __FUNCT__ "DSDPGetYMakeX"</span> <a name="l00455"></a><a class="code" href="group__DSDPSolver.html#gaedd5042b277efcd2774898fbf3bdd860">00455</a> <span class="preprocessor"></span><span class="keywordtype">int</span> <a class="code" href="group__DSDPSolver.html#gaedd5042b277efcd2774898fbf3bdd860" title="Copies the variables y used to construct X into an array.">DSDPGetYMakeX</a>(<a class="code" href="structDSDP__C.html" title="Internal structures for the DSDP solver.">DSDP</a> dsdp,<span class="keywordtype">double</span> y[], <span class="keywordtype">int</span> m){ <a name="l00456"></a>00456 <span class="keywordtype">int</span> i,info; <a name="l00457"></a>00457 <span class="keywordtype">double</span> scale,*yy; <a name="l00458"></a>00458 DSDPFunctionBegin; <a name="l00459"></a>00459 DSDPValid(dsdp); <a name="l00460"></a>00460 <span class="keywordflow">if</span> (dsdp->m < m-1) DSDPFunctionReturn(1); <a name="l00461"></a>00461 <span class="keywordflow">if</span> (dsdp->m > m) DSDPFunctionReturn(1); <a name="l00462"></a>00462 info=DSDPVecCopy(dsdp->xmaker[0].y,dsdp->ytemp); DSDPCHKERR(info); <a name="l00463"></a>00463 info=<a class="code" href="group__DSDPSolver.html#ga89e093b87698c2524d27fd97a8cbd3f6" title="Copy the internal scaling factor from the solver.">DSDPGetScale</a>(dsdp,&scale);DSDPCHKERR(info); <a name="l00464"></a>00464 info=DSDPVecGetArray(dsdp->ytemp,&yy);DSDPCHKERR(info); <a name="l00465"></a>00465 <span class="keywordflow">for</span> (i=0;i<m;i++) y[i]=yy[i+1]/scale; <a name="l00466"></a>00466 info=DSDPVecRestoreArray(dsdp->ytemp,&yy);DSDPCHKERR(info); <a name="l00467"></a>00467 DSDPFunctionReturn(0); <a name="l00468"></a>00468 } <a name="l00469"></a>00469 <a name="l00481"></a>00481 <span class="preprocessor">#undef __FUNCT__ </span> <a name="l00482"></a>00482 <span class="preprocessor"></span><span class="preprocessor">#define __FUNCT__ "DSDPGetDYMakeX"</span> <a name="l00483"></a><a class="code" href="group__DSDPSolver.html#ga79f8ff912fa519dea6ad93f06518b544">00483</a> <span class="preprocessor"></span><span class="keywordtype">int</span> <a class="code" href="group__DSDPSolver.html#ga79f8ff912fa519dea6ad93f06518b544" title="Copies the variables dy used to construct X into an array.">DSDPGetDYMakeX</a>(<a class="code" href="structDSDP__C.html" title="Internal structures for the DSDP solver.">DSDP</a> dsdp,<span class="keywordtype">double</span> dy[], <span class="keywordtype">int</span> m){ <a name="l00484"></a>00484 <span class="keywordtype">int</span> i,info; <a name="l00485"></a>00485 <span class="keywordtype">double</span> scale,*yy; <a name="l00486"></a>00486 DSDPFunctionBegin; <a name="l00487"></a>00487 DSDPValid(dsdp); <a name="l00488"></a>00488 <span class="keywordflow">if</span> (dsdp->m < m-1) DSDPFunctionReturn(1); <a name="l00489"></a>00489 <span class="keywordflow">if</span> (dsdp->m > m) DSDPFunctionReturn(1); <a name="l00490"></a>00490 info=DSDPVecCopy(dsdp->xmaker[0].dy,dsdp->ytemp); DSDPCHKERR(info); <a name="l00491"></a>00491 info=<a class="code" href="group__DSDPSolver.html#ga89e093b87698c2524d27fd97a8cbd3f6" title="Copy the internal scaling factor from the solver.">DSDPGetScale</a>(dsdp,&scale);DSDPCHKERR(info); <a name="l00492"></a>00492 info=DSDPVecGetArray(dsdp->ytemp,&yy);DSDPCHKERR(info); <a name="l00493"></a>00493 <span class="keywordflow">for</span> (i=0;i<m;i++) dy[i]=yy[i+1]/scale; <a name="l00494"></a>00494 info=DSDPVecRestoreArray(dsdp->ytemp,&yy);DSDPCHKERR(info); <a name="l00495"></a>00495 DSDPFunctionReturn(0); <a name="l00496"></a>00496 } <a name="l00497"></a>00497 <a name="l00509"></a>00509 <span class="preprocessor">#undef __FUNCT__ </span> <a name="l00510"></a>00510 <span class="preprocessor"></span><span class="preprocessor">#define __FUNCT__ "DSDPGetMuMakeX"</span> <a name="l00511"></a><a class="code" href="group__DSDPSolver.html#ga44ba54bc182256482af4ca016c60e435">00511</a> <span class="preprocessor"></span><span class="keywordtype">int</span> <a class="code" href="group__DSDPSolver.html#ga44ba54bc182256482af4ca016c60e435" title="Copies the value of mu used to construct X.">DSDPGetMuMakeX</a>(<a class="code" href="structDSDP__C.html" title="Internal structures for the DSDP solver.">DSDP</a> dsdp,<span class="keywordtype">double</span> *mu){ <a name="l00512"></a>00512 <span class="keywordtype">int</span> info; <a name="l00513"></a>00513 <span class="keywordtype">double</span> scale; <a name="l00514"></a>00514 DSDPFunctionBegin; <a name="l00515"></a>00515 DSDPValid(dsdp); <a name="l00516"></a>00516 info=<a class="code" href="group__DSDPSolver.html#ga89e093b87698c2524d27fd97a8cbd3f6" title="Copy the internal scaling factor from the solver.">DSDPGetScale</a>(dsdp,&scale);DSDPCHKERR(info); <a name="l00517"></a>00517 *mu=dsdp->xmaker[0].mu/scale; <a name="l00518"></a>00518 DSDPFunctionReturn(0); <a name="l00519"></a>00519 } <a name="l00520"></a>00520 </pre></div></div> </div> <hr class="footer"/><address class="footer"><small>Generated on Wed Jun 8 2011 for DSDP by  <a href="http://www.doxygen.org/index.html"> <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address> </body> </html>