Files
ortools-clone/docs/cpp/iteration__stats_8cc_source.html
Mizux Seiha 3b81c981c2 Update doc
2022-03-04 00:19:15 +01:00

704 lines
123 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!-- HTML header for doxygen 1.8.18-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://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"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.9.3"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>OR-Tools: iteration_stats.cc Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="styleSheet.tmp.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectlogo"><img alt="Logo" src="orLogo.png"/></td>
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">OR-Tools
&#160;<span id="projectnumber">9.3</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.3 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('iteration__stats_8cc_source.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle"><div class="title">iteration_stats.cc</div></div>
</div><!--header-->
<div class="contents">
<a href="iteration__stats_8cc.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">// Copyright 2010-2021 Google LLC</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment">// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">// you may not use this file except in compliance with the License.</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment">// You may obtain a copy of the License at</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">//</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment">// http://www.apache.org/licenses/LICENSE-2.0</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">//</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment">// Unless required by applicable law or agreed to in writing, software</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">// distributed under the License is distributed on an &quot;AS IS&quot; BASIS,</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment">// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment">// See the License for the specific language governing permissions and</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment">// limitations under the License.</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span> </div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="preprocessor">#include &quot;<a class="code" href="iteration__stats_8h.html">ortools/pdlp/iteration_stats.h</a>&quot;</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> </div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="preprocessor">#include &lt;algorithm&gt;</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#include &lt;cmath&gt;</span></div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="preprocessor">#include &lt;cstdint&gt;</span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="preprocessor">#include &lt;limits&gt;</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="preprocessor">#include &lt;random&gt;</span></div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="preprocessor">#include &lt;string&gt;</span></div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="preprocessor">#include &lt;utility&gt;</span></div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="preprocessor">#include &lt;vector&gt;</span></div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span> </div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span><span class="preprocessor">#include &quot;Eigen/Core&quot;</span></div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span><span class="preprocessor">#include &quot;Eigen/SparseCore&quot;</span></div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span><span class="preprocessor">#include &quot;absl/random/distributions.h&quot;</span></div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span><span class="preprocessor">#include &quot;absl/strings/str_cat.h&quot;</span></div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span><span class="preprocessor">#include &quot;absl/strings/str_format.h&quot;</span></div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span><span class="preprocessor">#include &quot;absl/strings/string_view.h&quot;</span></div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span><span class="preprocessor">#include &quot;absl/types/optional.h&quot;</span></div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span><span class="preprocessor">#include &quot;<a class="code" href="base_2logging_8h.html">ortools/base/logging.h</a>&quot;</span></div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span><span class="preprocessor">#include &quot;<a class="code" href="mathutil_8h.html">ortools/base/mathutil.h</a>&quot;</span></div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span><span class="preprocessor">#include &quot;<a class="code" href="quadratic__program_8h.html">ortools/pdlp/quadratic_program.h</a>&quot;</span></div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span><span class="preprocessor">#include &quot;<a class="code" href="sharded__quadratic__program_8h.html">ortools/pdlp/sharded_quadratic_program.h</a>&quot;</span></div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span><span class="preprocessor">#include &quot;<a class="code" href="sharder_8h.html">ortools/pdlp/sharder.h</a>&quot;</span></div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span><span class="preprocessor">#include &quot;ortools/pdlp/solve_log.pb.h&quot;</span></div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span><span class="preprocessor">#include &quot;ortools/pdlp/solvers.pb.h&quot;</span></div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span> </div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1pdlp.html"> 40</a></span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespaceoperations__research_1_1pdlp.html">operations_research::pdlp</a> {</div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span><span class="keyword">namespace </span>{</div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> </div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span>using ::Eigen::VectorXd;</div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> </div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span><span class="comment">// ResidualNorms contains four measures of the infeasibility of a primal or</span></div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span><span class="comment">// dual solution. &quot;objective_correction&quot; is the (additive) adjustment to the</span></div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span><span class="comment">// objective function from the reduced costs. &quot;objective_full_correction&quot; is the</span></div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span><span class="comment">// (additive) adjustment to the objective function if all dual residuals were</span></div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span><span class="comment">// set to zero, while l_inf_residual and l_2_residual are the L_infinity and L_2</span></div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span><span class="comment">// norms of the residuals (portions of the primal gradient not included in the</span></div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span><span class="comment">// reduced costs).</span></div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span><span class="keyword">struct </span>ResidualNorms {</div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"><a class="line" href="iteration__stats_8cc.html#a28460a7fdcd91c3a3a95b2b74aff7bb7"> 53</a></span> <span class="keywordtype">double</span> <a class="code hl_variable" href="iteration__stats_8cc.html#a28460a7fdcd91c3a3a95b2b74aff7bb7">objective_correction</a>;</div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"><a class="line" href="iteration__stats_8cc.html#a16e7df0f7c2a47748aaf9004258c6b13"> 54</a></span> <span class="keywordtype">double</span> <a class="code hl_variable" href="iteration__stats_8cc.html#a16e7df0f7c2a47748aaf9004258c6b13">objective_full_correction</a>;</div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"><a class="line" href="iteration__stats_8cc.html#aa731e3486184edfd00ea54e3a288175f"> 55</a></span> <span class="keywordtype">double</span> <a class="code hl_variable" href="iteration__stats_8cc.html#aa731e3486184edfd00ea54e3a288175f">l_inf_residual</a>;</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"><a class="line" href="iteration__stats_8cc.html#a16548fbf63af658d61de20a71baded7a"> 56</a></span> <span class="keywordtype">double</span> <a class="code hl_variable" href="iteration__stats_8cc.html#a16548fbf63af658d61de20a71baded7a">l_2_residual</a>;</div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span>};</div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> </div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span><span class="comment">// Computes norms of the primal residual infeasibilities (b - A x) of the</span></div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span><span class="comment">// unscaled problem. Note the primal residuals of the unscaled problem are equal</span></div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span><span class="comment">// to those of the scaled problem divided by row_scaling_vec. Does not perform</span></div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span><span class="comment">// any corrections (so the returned .correction == 0.0). sharded_qp is assumed</span></div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span><span class="comment">// to be the scaled problem. If use_homogeneous_primal_bounds is set to true</span></div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span><span class="comment">// the residuals are computed with upper and lower bounds zeroed out (note that</span></div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span><span class="comment">// we only zero out the bounds that are finite in the original problem).</span></div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span>ResidualNorms PrimalResidualNorms(</div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> <span class="keyword">const</span> ShardedQuadraticProgram&amp; sharded_qp, <span class="keyword">const</span> VectorXd&amp; row_scaling_vec,</div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> <span class="keyword">const</span> VectorXd&amp; scaled_primal_solution,</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> <span class="keywordtype">bool</span> use_homogeneous_constraint_bounds = <span class="keyword">false</span>) {</div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> <span class="keyword">const</span> QuadraticProgram&amp; qp = sharded_qp.Qp();</div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(row_scaling_vec.size(), sharded_qp.DualSize());</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(scaled_primal_solution.size(), sharded_qp.PrimalSize());</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> </div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> VectorXd primal_product = <a class="code hl_function" href="namespaceoperations__research_1_1pdlp.html#a463586ded0a114d3ca4b97a048d37d8a">TransposedMatrixVectorProduct</a>(</div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> sharded_qp.TransposedConstraintMatrix(), scaled_primal_solution,</div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> sharded_qp.TransposedConstraintMatrixSharder());</div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> VectorXd local_l_inf_residual(sharded_qp.DualSharder().NumShards());</div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> VectorXd local_sumsq_residual(sharded_qp.DualSharder().NumShards());</div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> sharded_qp.DualSharder().ParallelForEachShard(</div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> [&amp;](<span class="keyword">const</span> Sharder::Shard&amp; shard) {</div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> <span class="keyword">const</span> <span class="keyword">auto</span> lower_bound_shard = shard(qp.constraint_lower_bounds);</div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> <span class="keyword">const</span> <span class="keyword">auto</span> upper_bound_shard = shard(qp.constraint_upper_bounds);</div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> <span class="keyword">const</span> <span class="keyword">auto</span> row_scaling_shard = shard(row_scaling_vec);</div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> <span class="keyword">const</span> <span class="keyword">auto</span> primal_product_shard = shard(primal_product);</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> <span class="keywordtype">double</span> <a class="code hl_variable" href="iteration__stats_8cc.html#aa731e3486184edfd00ea54e3a288175f">l_inf_residual</a> = 0.0;</div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> <span class="keywordtype">double</span> sumsq_residual = 0.0;</div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> <span class="keywordflow">for</span> (int64_t i = 0; i &lt; primal_product_shard.size(); ++i) {</div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> <span class="keyword">const</span> <span class="keywordtype">double</span> <a class="code hl_variable" href="gscip__solver_8cc.html#a1ba5ca0f61f2fa13bd23bf0f89004f35">upper_bound</a> = (use_homogeneous_constraint_bounds &amp;&amp;</div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> std::isfinite(upper_bound_shard[i]))</div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> ? 0.0</div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> : upper_bound_shard[i];</div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> <span class="keyword">const</span> <span class="keywordtype">double</span> <a class="code hl_variable" href="gscip__solver_8cc.html#a1e2f9a2352c1d9a6cada9544898fceec">lower_bound</a> = (use_homogeneous_constraint_bounds &amp;&amp;</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> std::isfinite(lower_bound_shard[i]))</div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> ? 0.0</div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> : lower_bound_shard[i];</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> <span class="keywordtype">double</span> scaled_residual = 0.0;</div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> <span class="keywordflow">if</span> (primal_product_shard[i] &gt; <a class="code hl_variable" href="gscip__solver_8cc.html#a1ba5ca0f61f2fa13bd23bf0f89004f35">upper_bound</a>) {</div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> scaled_residual = primal_product_shard[i] - <a class="code hl_variable" href="gscip__solver_8cc.html#a1ba5ca0f61f2fa13bd23bf0f89004f35">upper_bound</a>;</div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> </div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (primal_product_shard[i] &lt; <a class="code hl_variable" href="gscip__solver_8cc.html#a1e2f9a2352c1d9a6cada9544898fceec">lower_bound</a>) {</div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> scaled_residual = <a class="code hl_variable" href="gscip__solver_8cc.html#a1e2f9a2352c1d9a6cada9544898fceec">lower_bound</a> - primal_product_shard[i];</div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> }</div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> <span class="keyword">const</span> <span class="keywordtype">double</span> residual = scaled_residual / row_scaling_shard[i];</div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> <a class="code hl_variable" href="iteration__stats_8cc.html#aa731e3486184edfd00ea54e3a288175f">l_inf_residual</a> = <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(<a class="code hl_variable" href="iteration__stats_8cc.html#aa731e3486184edfd00ea54e3a288175f">l_inf_residual</a>, residual);</div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> sumsq_residual += residual * residual;</div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> }</div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> local_l_inf_residual[shard.Index()] = <a class="code hl_variable" href="iteration__stats_8cc.html#aa731e3486184edfd00ea54e3a288175f">l_inf_residual</a>;</div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> local_sumsq_residual[shard.Index()] = sumsq_residual;</div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> });</div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> <span class="keywordflow">return</span> ResidualNorms{</div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> .objective_correction = 0.0,</div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> .objective_full_correction = 0.0,</div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> .l_inf_residual = local_l_inf_residual.lpNorm&lt;Eigen::Infinity&gt;(),</div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> .<a class="code hl_variable" href="iteration__stats_8cc.html#a16548fbf63af658d61de20a71baded7a">l_2_residual</a> = std::sqrt(local_sumsq_residual.sum()),</div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> };</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span>}</div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> </div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span><span class="comment">// Decides whether a primal gradient term should be handled as a reduced cost or</span></div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span><span class="comment">// as a dual residual.</span></div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span><span class="keywordtype">bool</span> HandlePrimalGradientTermAsReducedCost(<span class="keywordtype">double</span> primal_gradient,</div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> <span class="keywordtype">double</span> primal_value,</div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> <span class="keywordtype">double</span> <a class="code hl_variable" href="gscip__solver_8cc.html#a1e2f9a2352c1d9a6cada9544898fceec">lower_bound</a>,</div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> <span class="keywordtype">double</span> <a class="code hl_variable" href="gscip__solver_8cc.html#a1ba5ca0f61f2fa13bd23bf0f89004f35">upper_bound</a>) {</div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> <span class="keywordflow">if</span> (primal_gradient == 0.0) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> <span class="keywordflow">return</span> std::abs(primal_value -</div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> (primal_gradient &gt; 0.0 ? <a class="code hl_variable" href="gscip__solver_8cc.html#a1e2f9a2352c1d9a6cada9544898fceec">lower_bound</a> : <a class="code hl_variable" href="gscip__solver_8cc.html#a1ba5ca0f61f2fa13bd23bf0f89004f35">upper_bound</a>)) &lt;=</div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> std::abs(primal_value);</div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span>}</div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> </div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span><span class="comment">// Computes norms of the dual residuals and reduced costs of the unscaled</span></div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span><span class="comment">// problem. Note the primal gradient of the unscaled problem is equal to the</span></div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span><span class="comment">// scaled primal gradient divided by col_scaling_vec. sharded_qp is assumed to</span></div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span><span class="comment">// be the scaled problem. See</span></div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span><span class="comment">// https://developers.google.com/optimization/lp/pdlp_math for details and</span></div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span><span class="comment">// notation. Primal gradients that have corresponding (finite) bounds (the</span></div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span><span class="comment">// finite terms from (l^v)^T[r]_+ (u^v)^T[r]_ in the dual objective), and</span></div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span><span class="comment">// have |x - b| &lt;= |x| (where x is the variable&#39;s value and b is the</span></div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span><span class="comment">// corresponding bound) are treated as reduced costs and accumulated in</span></div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span><span class="comment">// objective_correction, while the other primal gradient terms are handled as</span></div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span><span class="comment">// residual infeasibilities in l_inf_residual and l_2_residual.</span></div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span>ResidualNorms DualResidualNorms(<span class="keyword">const</span> ShardedQuadraticProgram&amp; sharded_qp,</div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> <span class="keyword">const</span> VectorXd&amp; col_scaling_vec,</div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> <span class="keyword">const</span> VectorXd&amp; scaled_primal_solution,</div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> <span class="keyword">const</span> VectorXd&amp; scaled_primal_gradient) {</div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> <span class="keyword">const</span> QuadraticProgram&amp; qp = sharded_qp.Qp();</div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(col_scaling_vec.size(), sharded_qp.PrimalSize());</div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(scaled_primal_gradient.size(), sharded_qp.PrimalSize());</div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> VectorXd local_dual_correction(sharded_qp.PrimalSharder().NumShards());</div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> VectorXd local_dual_full_correction(sharded_qp.PrimalSharder().NumShards());</div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> VectorXd local_l_inf_residual(sharded_qp.PrimalSharder().NumShards());</div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> VectorXd local_sumsq_residual(sharded_qp.PrimalSharder().NumShards());</div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> sharded_qp.PrimalSharder().ParallelForEachShard(</div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> [&amp;](<span class="keyword">const</span> Sharder::Shard&amp; shard) {</div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> <span class="keyword">const</span> <span class="keyword">auto</span> lower_bound_shard = shard(qp.variable_lower_bounds);</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> <span class="keyword">const</span> <span class="keyword">auto</span> upper_bound_shard = shard(qp.variable_upper_bounds);</div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> <span class="keyword">const</span> <span class="keyword">auto</span> primal_gradient_shard = shard(scaled_primal_gradient);</div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> <span class="keyword">const</span> <span class="keyword">auto</span> col_scaling_shard = shard(col_scaling_vec);</div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> <span class="keyword">const</span> <span class="keyword">auto</span> primal_solution_shard = shard(scaled_primal_solution);</div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> <span class="keywordtype">double</span> dual_correction = 0.0;</div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> <span class="keywordtype">double</span> dual_full_correction = 0.0;</div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> <span class="keywordtype">double</span> <a class="code hl_variable" href="iteration__stats_8cc.html#aa731e3486184edfd00ea54e3a288175f">l_inf_residual</a> = 0.0;</div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> <span class="keywordtype">double</span> sumsq_residual = 0.0;</div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> <span class="keywordflow">for</span> (int64_t i = 0; i &lt; primal_gradient_shard.size(); ++i) {</div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> <span class="comment">// The corrections use the scaled values because</span></div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span> <span class="comment">// unscaled_lower_bound = lower_bound * scale and</span></div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> <span class="comment">// unscaled_primal_gradient = primal_gradient / scale, so the scales</span></div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span> <span class="comment">// cancel out.</span></div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> <span class="keywordflow">if</span> (primal_gradient_shard[i] == 0.0) <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span> <span class="keyword">const</span> <span class="keywordtype">double</span> bound_for_rc = primal_gradient_shard[i] &gt; 0.0</div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> ? lower_bound_shard[i]</div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span> : upper_bound_shard[i];</div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> dual_full_correction += bound_for_rc * primal_gradient_shard[i];</div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> <span class="keywordflow">if</span> (HandlePrimalGradientTermAsReducedCost(</div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> primal_gradient_shard[i], primal_solution_shard[i],</div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> lower_bound_shard[i], upper_bound_shard[i])) {</div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> dual_correction += bound_for_rc * primal_gradient_shard[i];</div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span> <span class="keyword">const</span> <span class="keywordtype">double</span> scaled_residual = std::abs(primal_gradient_shard[i]);</div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> <span class="keyword">const</span> <span class="keywordtype">double</span> residual = scaled_residual / col_scaling_shard[i];</div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> <a class="code hl_variable" href="iteration__stats_8cc.html#aa731e3486184edfd00ea54e3a288175f">l_inf_residual</a> = <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(<a class="code hl_variable" href="iteration__stats_8cc.html#aa731e3486184edfd00ea54e3a288175f">l_inf_residual</a>, residual);</div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span> sumsq_residual += residual * residual;</div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> }</div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span> }</div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span> local_dual_correction[shard.Index()] = dual_correction;</div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> local_dual_full_correction[shard.Index()] = dual_full_correction;</div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> local_l_inf_residual[shard.Index()] = <a class="code hl_variable" href="iteration__stats_8cc.html#aa731e3486184edfd00ea54e3a288175f">l_inf_residual</a>;</div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span> local_sumsq_residual[shard.Index()] = sumsq_residual;</div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> });</div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span> <span class="keywordflow">return</span> ResidualNorms{</div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span> .objective_correction = local_dual_correction.sum(),</div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> .objective_full_correction = local_dual_full_correction.sum(),</div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> .l_inf_residual = local_l_inf_residual.lpNorm&lt;Eigen::Infinity&gt;(),</div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> .<a class="code hl_variable" href="iteration__stats_8cc.html#a16548fbf63af658d61de20a71baded7a">l_2_residual</a> = std::sqrt(local_sumsq_residual.sum()),</div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> };</div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span>}</div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> </div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span><span class="comment">// Returns Qx.</span></div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span>VectorXd ObjectiveProduct(<span class="keyword">const</span> ShardedQuadraticProgram&amp; sharded_qp,</div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> <span class="keyword">const</span> VectorXd&amp; primal_solution) {</div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(primal_solution.size(), sharded_qp.PrimalSize());</div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> VectorXd result(primal_solution.size());</div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="namespaceoperations__research_1_1pdlp.html#a850865b3deabb2a623e130691df99f15">IsLinearProgram</a>(sharded_qp.Qp())) {</div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> result.setZero();</div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span> sharded_qp.PrimalSharder().ParallelForEachShard(</div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> [&amp;](<span class="keyword">const</span> Sharder::Shard&amp; shard) {</div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> shard(result) =</div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> shard(*sharded_qp.Qp().objective_matrix) * shard(primal_solution);</div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> });</div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> }</div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span>}</div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> </div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span><span class="comment">// Returns 1/2 x^T Q x (the quadratic term in the objective).</span></div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span><span class="keywordtype">double</span> QuadraticObjective(<span class="keyword">const</span> ShardedQuadraticProgram&amp; sharded_qp,</div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> <span class="keyword">const</span> VectorXd&amp; primal_solution,</div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> <span class="keyword">const</span> VectorXd&amp; objective_product) {</div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(primal_solution.size(), sharded_qp.PrimalSize());</div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(objective_product.size(), sharded_qp.PrimalSize());</div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> <span class="keywordflow">return</span> 0.5 *</div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> <a class="code hl_function" href="namespaceoperations__research_1_1pdlp.html#a11831586b99d28a708bc103bce1a945e">Dot</a>(objective_product, primal_solution, sharded_qp.PrimalSharder());</div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span>}</div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span> </div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span><span class="comment">// Returns objective_product + c A^T y when use_zero_primal_objective =</span></div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span><span class="comment">// false, and returns A^T y when use_zero_primal_objective = true.</span></div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span><span class="comment">// objective_product is passed by copy, and modified in place.</span></div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno"> 227</span>VectorXd PrimalGradientFromObjectiveProduct(</div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span> <span class="keyword">const</span> ShardedQuadraticProgram&amp; sharded_qp, <span class="keyword">const</span> VectorXd&amp; dual_solution,</div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> VectorXd objective_product, <span class="keywordtype">bool</span> use_zero_primal_objective = <span class="keyword">false</span>) {</div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span> <span class="keyword">const</span> QuadraticProgram&amp; qp = sharded_qp.Qp();</div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(dual_solution.size(), sharded_qp.DualSize());</div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(objective_product.size(), sharded_qp.PrimalSize());</div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span> </div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span> <span class="comment">// Note that this modifies objective_product, replacing its entries with</span></div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span> <span class="comment">// the primal gradient.</span></div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span> sharded_qp.ConstraintMatrixSharder().ParallelForEachShard(</div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span> [&amp;](<span class="keyword">const</span> Sharder::Shard&amp; shard) {</div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span> <span class="keywordflow">if</span> (use_zero_primal_objective) {</div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span> shard(objective_product) =</div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span> -shard(qp.constraint_matrix).transpose() * dual_solution;</div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span> shard(objective_product) +=</div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span> shard(qp.objective_vector) -</div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span> shard(qp.constraint_matrix).transpose() * dual_solution;</div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno"> 245</span> }</div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"> 246</span> });</div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno"> 247</span> <span class="keywordflow">return</span> objective_product;</div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno"> 248</span>}</div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno"> 249</span> </div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno"> 250</span><span class="comment">// Returns the value of y term in the objective of the dual problem, see</span></div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno"> 251</span><span class="comment">// (l^c)^T[y]_+ (u^c)^T[y]_ in the dual objective from</span></div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno"> 252</span><span class="comment">// https://developers.google.com/optimization/lp/pdlp_math.</span></div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno"> 253</span><span class="keywordtype">double</span> DualObjectiveBoundsTerm(<span class="keyword">const</span> ShardedQuadraticProgram&amp; sharded_qp,</div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno"> 254</span> <span class="keyword">const</span> VectorXd&amp; dual_solution) {</div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno"> 255</span> <span class="keyword">const</span> QuadraticProgram&amp; qp = sharded_qp.Qp();</div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno"> 256</span> <span class="keywordflow">return</span> sharded_qp.DualSharder().ParallelSumOverShards(</div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno"> 257</span> [&amp;](<span class="keyword">const</span> Sharder::Shard&amp; shard) {</div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno"> 258</span> <span class="comment">// This assumes that the dual variables are feasible, that is, that</span></div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno"> 259</span> <span class="comment">// the term corresponding to the &quot;y&quot; variables in the dual objective</span></div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno"> 260</span> <span class="comment">// in https://developers.google.com/optimization/lp/pdlp_math is finite.</span></div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno"> 261</span> <span class="keyword">const</span> <span class="keyword">auto</span> lower_bound_shard = shard(qp.constraint_lower_bounds);</div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno"> 262</span> <span class="keyword">const</span> <span class="keyword">auto</span> upper_bound_shard = shard(qp.constraint_upper_bounds);</div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno"> 263</span> <span class="keyword">const</span> <span class="keyword">auto</span> dual_shard = shard(dual_solution);</div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno"> 264</span> <span class="comment">// Can&#39;t use .dot(.cwiseMin()) because that gives 0 * inf = NaN.</span></div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno"> 265</span> <span class="keywordtype">double</span> sum = 0.0;</div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno"> 266</span> <span class="keywordflow">for</span> (int64_t i = 0; i &lt; dual_shard.size(); ++i) {</div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno"> 267</span> <span class="keywordflow">if</span> (dual_shard[i] &gt; 0.0) {</div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno"> 268</span> sum += lower_bound_shard[i] * dual_shard[i];</div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno"> 269</span> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dual_shard[i] &lt; 0.0) {</div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno"> 270</span> sum += upper_bound_shard[i] * dual_shard[i];</div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno"> 271</span> }</div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno"> 272</span> }</div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno"> 273</span> <span class="keywordflow">return</span> sum;</div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno"> 274</span> });</div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno"> 275</span>}</div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno"> 276</span> </div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno"> 277</span><span class="comment">// Computes the projection of the vector onto a pseudo-random vector determined</span></div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"> 278</span><span class="comment">// by seed_generator. seed_generator is used as the source of a random seed for</span></div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno"> 279</span><span class="comment">// each shard&#39;s portion of the vector.</span></div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"> 280</span><span class="keywordtype">double</span> RandomProjection(<span class="keyword">const</span> VectorXd&amp; vector, <span class="keyword">const</span> Sharder&amp; sharder,</div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno"> 281</span> std::mt19937&amp; seed_generator) {</div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno"> 282</span> std::vector&lt;std::mt19937&gt; shard_seeds;</div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno"> 283</span> shard_seeds.reserve(sharder.NumShards());</div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno"> 284</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> shard = 0; shard &lt; sharder.NumShards(); ++shard) {</div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno"> 285</span> shard_seeds.emplace_back((seed_generator)());</div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno"> 286</span> }</div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno"> 287</span> <span class="comment">// Computes vector * gaussian_random_vector and</span></div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno"> 288</span> <span class="comment">// ||gaussian_random_vector||^2 to normalize by afterwards.</span></div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno"> 289</span> VectorXd dot_product(sharder.NumShards());</div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno"> 290</span> VectorXd gaussian_norm_squared(sharder.NumShards());</div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno"> 291</span> sharder.ParallelForEachShard([&amp;](<span class="keyword">const</span> Sharder::Shard&amp; shard) {</div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno"> 292</span> <span class="keyword">const</span> <span class="keyword">auto</span> vector_shard = shard(vector);</div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno"> 293</span> <span class="keywordtype">double</span> shard_dot_product = 0.0;</div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno"> 294</span> <span class="keywordtype">double</span> shard_norm_squared = 0.0;</div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno"> 295</span> std::mt19937 random{shard_seeds[shard.Index()]};</div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno"> 296</span> <span class="keywordflow">for</span> (int64_t i = 0; i &lt; vector_shard.size(); ++i) {</div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno"> 297</span> <span class="keyword">const</span> <span class="keywordtype">double</span> projection_element = absl::Gaussian(random, 0.0, 1.0);</div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno"> 298</span> shard_dot_product += projection_element * vector_shard[i];</div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno"> 299</span> shard_norm_squared += <a class="code hl_function" href="classoperations__research_1_1_math_util.html#aac72849250cdf23aefdd991eb0fc0385">MathUtil::Square</a>(projection_element);</div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno"> 300</span> }</div>
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno"> 301</span> dot_product[shard.Index()] = shard_dot_product;</div>
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno"> 302</span> gaussian_norm_squared[shard.Index()] = shard_norm_squared;</div>
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno"> 303</span> });</div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno"> 304</span> <span class="keywordflow">return</span> dot_product.sum() / std::sqrt(gaussian_norm_squared.sum());</div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno"> 305</span>}</div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno"> 306</span>} <span class="comment">// namespace</span></div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno"> 307</span> </div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1pdlp.html#ac77694ebaac0adfa0fce8422782c48c8"> 308</a></span>ConvergenceInformation <a class="code hl_function" href="namespaceoperations__research_1_1pdlp.html#ac77694ebaac0adfa0fce8422782c48c8">ComputeConvergenceInformation</a>(</div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno"> 309</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html">ShardedQuadraticProgram</a>&amp; scaled_sharded_qp,</div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno"> 310</span> <span class="keyword">const</span> Eigen::VectorXd&amp; col_scaling_vec,</div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno"> 311</span> <span class="keyword">const</span> Eigen::VectorXd&amp; row_scaling_vec,</div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno"> 312</span> <span class="keyword">const</span> Eigen::VectorXd&amp; scaled_primal_solution,</div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno"> 313</span> <span class="keyword">const</span> Eigen::VectorXd&amp; scaled_dual_solution, PointType candidate_type) {</div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno"> 314</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1pdlp_1_1_quadratic_program.html">QuadraticProgram</a>&amp; qp = scaled_sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#abfdc79e4b2325ff283b7d2333d40fffe">Qp</a>();</div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno"> 315</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(col_scaling_vec.size(), scaled_sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#ab945b88f1937277a896d4c7c7935d605">PrimalSize</a>());</div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno"> 316</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(row_scaling_vec.size(), scaled_sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#afcafa95b1a351212291c7a030deec52a">DualSize</a>());</div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno"> 317</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(scaled_primal_solution.size(), scaled_sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#ab945b88f1937277a896d4c7c7935d605">PrimalSize</a>());</div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno"> 318</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(scaled_dual_solution.size(), scaled_sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#afcafa95b1a351212291c7a030deec52a">DualSize</a>());</div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno"> 319</span> </div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno"> 320</span> <span class="comment">// See https://developers.google.com/optimization/lp/pdlp_math#rescaling for</span></div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno"> 321</span> <span class="comment">// notes describing the connection between the scaled and unscaled problem.</span></div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno"> 322</span> </div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno"> 323</span> ConvergenceInformation result;</div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno"> 324</span> ResidualNorms primal_residuals = PrimalResidualNorms(</div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno"> 325</span> scaled_sharded_qp, row_scaling_vec, scaled_primal_solution);</div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno"> 326</span> result.set_l_inf_primal_residual(primal_residuals.l_inf_residual);</div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno"> 327</span> result.set_l2_primal_residual(primal_residuals.l_2_residual);</div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno"> 328</span> </div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno"> 329</span> result.set_l_inf_primal_variable(</div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno"> 330</span> <a class="code hl_function" href="namespaceoperations__research_1_1pdlp.html#a55b8c43a5adfafddb030074c75aeef70">ScaledLInfNorm</a>(scaled_primal_solution, col_scaling_vec,</div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno"> 331</span> scaled_sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#ab7ab55f549e3f9c1a1c8c8d2b766f75b">PrimalSharder</a>()));</div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno"> 332</span> result.set_l2_primal_variable(<a class="code hl_function" href="namespaceoperations__research_1_1pdlp.html#a0b812156619599417e29521a41b7a734">ScaledNorm</a>(scaled_primal_solution,</div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno"> 333</span> col_scaling_vec,</div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno"> 334</span> scaled_sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#ab7ab55f549e3f9c1a1c8c8d2b766f75b">PrimalSharder</a>()));</div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno"> 335</span> result.set_l_inf_dual_variable(<a class="code hl_function" href="namespaceoperations__research_1_1pdlp.html#a55b8c43a5adfafddb030074c75aeef70">ScaledLInfNorm</a>(</div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno"> 336</span> scaled_dual_solution, row_scaling_vec, scaled_sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#a101ca40b60dd25bbf6271bef1370e8d1">DualSharder</a>()));</div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno"> 337</span> result.set_l2_dual_variable(<a class="code hl_function" href="namespaceoperations__research_1_1pdlp.html#a0b812156619599417e29521a41b7a734">ScaledNorm</a>(scaled_dual_solution, row_scaling_vec,</div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno"> 338</span> scaled_sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#a101ca40b60dd25bbf6271bef1370e8d1">DualSharder</a>()));</div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno"> 339</span> </div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno"> 340</span> VectorXd scaled_objective_product =</div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno"> 341</span> ObjectiveProduct(scaled_sharded_qp, scaled_primal_solution);</div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno"> 342</span> <span class="keyword">const</span> <span class="keywordtype">double</span> quadratic_objective = QuadraticObjective(</div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno"> 343</span> scaled_sharded_qp, scaled_primal_solution, scaled_objective_product);</div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno"> 344</span> VectorXd scaled_primal_gradient = PrimalGradientFromObjectiveProduct(</div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno"> 345</span> scaled_sharded_qp, scaled_dual_solution,</div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno"> 346</span> std::move(scaled_objective_product));</div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno"> 347</span> result.set_primal_objective(qp.<a class="code hl_function" href="structoperations__research_1_1pdlp_1_1_quadratic_program.html#a2d3828418aef02f4f8897c2d3db75b2f">ApplyObjectiveScalingAndOffset</a>(</div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno"> 348</span> quadratic_objective + <a class="code hl_function" href="namespaceoperations__research_1_1pdlp.html#a11831586b99d28a708bc103bce1a945e">Dot</a>(qp.<a class="code hl_variable" href="structoperations__research_1_1pdlp_1_1_quadratic_program.html#afdb3e07cd380793e1b265c1fded94edd">objective_vector</a>, scaled_primal_solution,</div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno"> 349</span> scaled_sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#ab7ab55f549e3f9c1a1c8c8d2b766f75b">PrimalSharder</a>())));</div>
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno"> 350</span> </div>
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno"> 351</span> <span class="comment">// This is the dual objective from</span></div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno"> 352</span> <span class="comment">// https://developers.google.com/optimization/lp/pdlp_math minus the last term</span></div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno"> 353</span> <span class="comment">// (involving r). All scaling terms cancel out.</span></div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno"> 354</span> <span class="keyword">const</span> <span class="keywordtype">double</span> dual_objective_piece =</div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno"> 355</span> -quadratic_objective +</div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno"> 356</span> DualObjectiveBoundsTerm(scaled_sharded_qp, scaled_dual_solution);</div>
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno"> 357</span> </div>
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno"> 358</span> ResidualNorms dual_residuals =</div>
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno"> 359</span> DualResidualNorms(scaled_sharded_qp, col_scaling_vec,</div>
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno"> 360</span> scaled_primal_solution, scaled_primal_gradient);</div>
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno"> 361</span> result.set_dual_objective(qp.<a class="code hl_function" href="structoperations__research_1_1pdlp_1_1_quadratic_program.html#a2d3828418aef02f4f8897c2d3db75b2f">ApplyObjectiveScalingAndOffset</a>(</div>
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno"> 362</span> dual_objective_piece + dual_residuals.objective_correction));</div>
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno"> 363</span> result.set_corrected_dual_objective(qp.<a class="code hl_function" href="structoperations__research_1_1pdlp_1_1_quadratic_program.html#a2d3828418aef02f4f8897c2d3db75b2f">ApplyObjectiveScalingAndOffset</a>(</div>
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno"> 364</span> dual_objective_piece + dual_residuals.objective_full_correction));</div>
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno"> 365</span> result.set_l_inf_dual_residual(dual_residuals.l_inf_residual);</div>
<div class="line"><a id="l00366" name="l00366"></a><span class="lineno"> 366</span> result.set_l2_dual_residual(dual_residuals.l_2_residual);</div>
<div class="line"><a id="l00367" name="l00367"></a><span class="lineno"> 367</span> </div>
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno"> 368</span> result.set_candidate_type(candidate_type);</div>
<div class="line"><a id="l00369" name="l00369"></a><span class="lineno"> 369</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l00370" name="l00370"></a><span class="lineno"> 370</span>}</div>
<div class="line"><a id="l00371" name="l00371"></a><span class="lineno"> 371</span> </div>
<div class="line"><a id="l00372" name="l00372"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1pdlp.html#a74af5ceb7b6e37fbfca92e2c59b99e3e"> 372</a></span>InfeasibilityInformation <a class="code hl_function" href="namespaceoperations__research_1_1pdlp.html#a74af5ceb7b6e37fbfca92e2c59b99e3e">ComputeInfeasibilityInformation</a>(</div>
<div class="line"><a id="l00373" name="l00373"></a><span class="lineno"> 373</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html">ShardedQuadraticProgram</a>&amp; scaled_sharded_qp,</div>
<div class="line"><a id="l00374" name="l00374"></a><span class="lineno"> 374</span> <span class="keyword">const</span> Eigen::VectorXd&amp; col_scaling_vec,</div>
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno"> 375</span> <span class="keyword">const</span> Eigen::VectorXd&amp; row_scaling_vec,</div>
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno"> 376</span> <span class="keyword">const</span> Eigen::VectorXd&amp; scaled_primal_ray,</div>
<div class="line"><a id="l00377" name="l00377"></a><span class="lineno"> 377</span> <span class="keyword">const</span> Eigen::VectorXd&amp; scaled_dual_ray, PointType candidate_type) {</div>
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno"> 378</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1pdlp_1_1_quadratic_program.html">QuadraticProgram</a>&amp; qp = scaled_sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#abfdc79e4b2325ff283b7d2333d40fffe">Qp</a>();</div>
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno"> 379</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(col_scaling_vec.size(), scaled_sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#ab945b88f1937277a896d4c7c7935d605">PrimalSize</a>());</div>
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno"> 380</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(row_scaling_vec.size(), scaled_sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#afcafa95b1a351212291c7a030deec52a">DualSize</a>());</div>
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno"> 381</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(scaled_primal_ray.size(), scaled_sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#ab945b88f1937277a896d4c7c7935d605">PrimalSize</a>());</div>
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno"> 382</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(scaled_dual_ray.size(), scaled_sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#afcafa95b1a351212291c7a030deec52a">DualSize</a>());</div>
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno"> 383</span> </div>
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno"> 384</span> <span class="keywordtype">double</span> l_inf_primal = <a class="code hl_function" href="namespaceoperations__research_1_1pdlp.html#a55b8c43a5adfafddb030074c75aeef70">ScaledLInfNorm</a>(scaled_primal_ray, col_scaling_vec,</div>
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno"> 385</span> scaled_sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#ab7ab55f549e3f9c1a1c8c8d2b766f75b">PrimalSharder</a>());</div>
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno"> 386</span> <span class="keywordtype">double</span> l_inf_dual = <a class="code hl_function" href="namespaceoperations__research_1_1pdlp.html#a55b8c43a5adfafddb030074c75aeef70">ScaledLInfNorm</a>(scaled_dual_ray, row_scaling_vec,</div>
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno"> 387</span> scaled_sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#a101ca40b60dd25bbf6271bef1370e8d1">DualSharder</a>());</div>
<div class="line"><a id="l00388" name="l00388"></a><span class="lineno"> 388</span> InfeasibilityInformation result;</div>
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno"> 389</span> <span class="comment">// Compute primal infeasibility information.</span></div>
<div class="line"><a id="l00390" name="l00390"></a><span class="lineno"> 390</span> VectorXd scaled_primal_gradient = PrimalGradientFromObjectiveProduct(</div>
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno"> 391</span> scaled_sharded_qp, scaled_dual_ray,</div>
<div class="line"><a id="l00392" name="l00392"></a><span class="lineno"> 392</span> <a class="code hl_function" href="namespaceoperations__research.html#a5a9881f8a07b166ef2cbde572cea27b6">VectorXd::Zero</a>(scaled_sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#ab945b88f1937277a896d4c7c7935d605">PrimalSize</a>()),</div>
<div class="line"><a id="l00393" name="l00393"></a><span class="lineno"> 393</span> <span class="comment">/*use_zero_primal_objective=*/</span><span class="keyword">true</span>);</div>
<div class="line"><a id="l00394" name="l00394"></a><span class="lineno"> 394</span> ResidualNorms dual_residuals =</div>
<div class="line"><a id="l00395" name="l00395"></a><span class="lineno"> 395</span> DualResidualNorms(scaled_sharded_qp, col_scaling_vec, scaled_primal_ray,</div>
<div class="line"><a id="l00396" name="l00396"></a><span class="lineno"> 396</span> scaled_primal_gradient);</div>
<div class="line"><a id="l00397" name="l00397"></a><span class="lineno"> 397</span> </div>
<div class="line"><a id="l00398" name="l00398"></a><span class="lineno"> 398</span> <span class="keywordtype">double</span> dual_ray_objective =</div>
<div class="line"><a id="l00399" name="l00399"></a><span class="lineno"> 399</span> DualObjectiveBoundsTerm(scaled_sharded_qp, scaled_dual_ray) +</div>
<div class="line"><a id="l00400" name="l00400"></a><span class="lineno"> 400</span> dual_residuals.objective_correction;</div>
<div class="line"><a id="l00401" name="l00401"></a><span class="lineno"> 401</span> <span class="keywordflow">if</span> (l_inf_dual &gt; 0) {</div>
<div class="line"><a id="l00402" name="l00402"></a><span class="lineno"> 402</span> result.set_dual_ray_objective(dual_ray_objective / l_inf_dual);</div>
<div class="line"><a id="l00403" name="l00403"></a><span class="lineno"> 403</span> result.set_max_dual_ray_infeasibility(dual_residuals.l_inf_residual /</div>
<div class="line"><a id="l00404" name="l00404"></a><span class="lineno"> 404</span> l_inf_dual);</div>
<div class="line"><a id="l00405" name="l00405"></a><span class="lineno"> 405</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00406" name="l00406"></a><span class="lineno"> 406</span> result.set_dual_ray_objective(0.0);</div>
<div class="line"><a id="l00407" name="l00407"></a><span class="lineno"> 407</span> result.set_max_dual_ray_infeasibility(0.0);</div>
<div class="line"><a id="l00408" name="l00408"></a><span class="lineno"> 408</span> }</div>
<div class="line"><a id="l00409" name="l00409"></a><span class="lineno"> 409</span> </div>
<div class="line"><a id="l00410" name="l00410"></a><span class="lineno"> 410</span> <span class="comment">// Compute dual infeasibility information.</span></div>
<div class="line"><a id="l00411" name="l00411"></a><span class="lineno"> 411</span> ResidualNorms primal_residuals =</div>
<div class="line"><a id="l00412" name="l00412"></a><span class="lineno"> 412</span> PrimalResidualNorms(scaled_sharded_qp, row_scaling_vec, scaled_primal_ray,</div>
<div class="line"><a id="l00413" name="l00413"></a><span class="lineno"> 413</span> <span class="comment">/*use_homogeneous_constraint_bounds=*/</span><span class="keyword">true</span>);</div>
<div class="line"><a id="l00414" name="l00414"></a><span class="lineno"> 414</span> <span class="comment">// primal_residuals contains the violations of the linear constraints. The</span></div>
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno"> 415</span> <span class="comment">// signs of the components are also constrained by the presence or absence</span></div>
<div class="line"><a id="l00416" name="l00416"></a><span class="lineno"> 416</span> <span class="comment">// of variable bounds.</span></div>
<div class="line"><a id="l00417" name="l00417"></a><span class="lineno"> 417</span> VectorXd primal_ray_local_sign_max_violation(</div>
<div class="line"><a id="l00418" name="l00418"></a><span class="lineno"> 418</span> scaled_sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#ab7ab55f549e3f9c1a1c8c8d2b766f75b">PrimalSharder</a>().<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharder.html#aa6c18d04d5fcbe7a9343768b8b66be7f">NumShards</a>());</div>
<div class="line"><a id="l00419" name="l00419"></a><span class="lineno"> 419</span> scaled_sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#ab7ab55f549e3f9c1a1c8c8d2b766f75b">PrimalSharder</a>().<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharder.html#a5bbfc4ed3da7a0815ba5f6c7ddee320b">ParallelForEachShard</a>(</div>
<div class="line"><a id="l00420" name="l00420"></a><span class="lineno"> 420</span> [&amp;](<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1pdlp_1_1_sharder_1_1_shard.html">Sharder::Shard</a>&amp; shard) {</div>
<div class="line"><a id="l00421" name="l00421"></a><span class="lineno"> 421</span> <span class="keyword">const</span> <span class="keyword">auto</span> lower_bound_shard =</div>
<div class="line"><a id="l00422" name="l00422"></a><span class="lineno"> 422</span> shard(scaled_sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#abfdc79e4b2325ff283b7d2333d40fffe">Qp</a>().<a class="code hl_variable" href="structoperations__research_1_1pdlp_1_1_quadratic_program.html#a0f72e7b49f91d0b980f5a54a18c06964">variable_lower_bounds</a>);</div>
<div class="line"><a id="l00423" name="l00423"></a><span class="lineno"> 423</span> <span class="keyword">const</span> <span class="keyword">auto</span> upper_bound_shard =</div>
<div class="line"><a id="l00424" name="l00424"></a><span class="lineno"> 424</span> shard(scaled_sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#abfdc79e4b2325ff283b7d2333d40fffe">Qp</a>().<a class="code hl_variable" href="structoperations__research_1_1pdlp_1_1_quadratic_program.html#a097d329b7af662bea9b5a8e310a22726">variable_upper_bounds</a>);</div>
<div class="line"><a id="l00425" name="l00425"></a><span class="lineno"> 425</span> <span class="keyword">const</span> <span class="keyword">auto</span> ray_shard = shard(scaled_primal_ray);</div>
<div class="line"><a id="l00426" name="l00426"></a><span class="lineno"> 426</span> <span class="keyword">const</span> <span class="keyword">auto</span> scale_shard = shard(col_scaling_vec);</div>
<div class="line"><a id="l00427" name="l00427"></a><span class="lineno"> 427</span> <span class="keywordtype">double</span> local_max = 0.0;</div>
<div class="line"><a id="l00428" name="l00428"></a><span class="lineno"> 428</span> <span class="keywordflow">for</span> (int64_t i = 0; i &lt; ray_shard.size(); ++i) {</div>
<div class="line"><a id="l00429" name="l00429"></a><span class="lineno"> 429</span> <span class="keywordflow">if</span> (std::isfinite(lower_bound_shard[i])) {</div>
<div class="line"><a id="l00430" name="l00430"></a><span class="lineno"> 430</span> local_max = <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(local_max, -ray_shard[i] * scale_shard[i]);</div>
<div class="line"><a id="l00431" name="l00431"></a><span class="lineno"> 431</span> }</div>
<div class="line"><a id="l00432" name="l00432"></a><span class="lineno"> 432</span> <span class="keywordflow">if</span> (std::isfinite(upper_bound_shard[i])) {</div>
<div class="line"><a id="l00433" name="l00433"></a><span class="lineno"> 433</span> local_max = <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(local_max, ray_shard[i] * scale_shard[i]);</div>
<div class="line"><a id="l00434" name="l00434"></a><span class="lineno"> 434</span> }</div>
<div class="line"><a id="l00435" name="l00435"></a><span class="lineno"> 435</span> }</div>
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno"> 436</span> primal_ray_local_sign_max_violation[shard.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharder_1_1_shard.html#a8ef12397d1682615bc3108c397734179">Index</a>()] = local_max;</div>
<div class="line"><a id="l00437" name="l00437"></a><span class="lineno"> 437</span> });</div>
<div class="line"><a id="l00438" name="l00438"></a><span class="lineno"> 438</span> <span class="keyword">const</span> <span class="keywordtype">double</span> primal_ray_sign_max_violation =</div>
<div class="line"><a id="l00439" name="l00439"></a><span class="lineno"> 439</span> primal_ray_local_sign_max_violation.lpNorm&lt;Eigen::Infinity&gt;();</div>
<div class="line"><a id="l00440" name="l00440"></a><span class="lineno"> 440</span> </div>
<div class="line"><a id="l00441" name="l00441"></a><span class="lineno"> 441</span> <span class="keywordflow">if</span> (l_inf_primal &gt; 0.0) {</div>
<div class="line"><a id="l00442" name="l00442"></a><span class="lineno"> 442</span> VectorXd scaled_objective_product =</div>
<div class="line"><a id="l00443" name="l00443"></a><span class="lineno"> 443</span> ObjectiveProduct(scaled_sharded_qp, scaled_primal_ray);</div>
<div class="line"><a id="l00444" name="l00444"></a><span class="lineno"> 444</span> result.set_primal_ray_quadratic_norm(</div>
<div class="line"><a id="l00445" name="l00445"></a><span class="lineno"> 445</span> <a class="code hl_function" href="namespaceoperations__research_1_1pdlp.html#a33a42241df5501b0165ee77c3de54d7f">LInfNorm</a>(scaled_objective_product, scaled_sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#ab7ab55f549e3f9c1a1c8c8d2b766f75b">PrimalSharder</a>()) /</div>
<div class="line"><a id="l00446" name="l00446"></a><span class="lineno"> 446</span> l_inf_primal);</div>
<div class="line"><a id="l00447" name="l00447"></a><span class="lineno"> 447</span> result.set_max_primal_ray_infeasibility(</div>
<div class="line"><a id="l00448" name="l00448"></a><span class="lineno"> 448</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(primal_residuals.l_inf_residual,</div>
<div class="line"><a id="l00449" name="l00449"></a><span class="lineno"> 449</span> primal_ray_sign_max_violation) /</div>
<div class="line"><a id="l00450" name="l00450"></a><span class="lineno"> 450</span> l_inf_primal);</div>
<div class="line"><a id="l00451" name="l00451"></a><span class="lineno"> 451</span> result.set_primal_ray_linear_objective(</div>
<div class="line"><a id="l00452" name="l00452"></a><span class="lineno"> 452</span> <a class="code hl_function" href="namespaceoperations__research_1_1pdlp.html#a11831586b99d28a708bc103bce1a945e">Dot</a>(scaled_primal_ray, qp.<a class="code hl_variable" href="structoperations__research_1_1pdlp_1_1_quadratic_program.html#afdb3e07cd380793e1b265c1fded94edd">objective_vector</a>,</div>
<div class="line"><a id="l00453" name="l00453"></a><span class="lineno"> 453</span> scaled_sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#ab7ab55f549e3f9c1a1c8c8d2b766f75b">PrimalSharder</a>()) /</div>
<div class="line"><a id="l00454" name="l00454"></a><span class="lineno"> 454</span> l_inf_primal);</div>
<div class="line"><a id="l00455" name="l00455"></a><span class="lineno"> 455</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00456" name="l00456"></a><span class="lineno"> 456</span> result.set_primal_ray_quadratic_norm(0.0);</div>
<div class="line"><a id="l00457" name="l00457"></a><span class="lineno"> 457</span> result.set_max_primal_ray_infeasibility(0.0);</div>
<div class="line"><a id="l00458" name="l00458"></a><span class="lineno"> 458</span> result.set_primal_ray_linear_objective(0.0);</div>
<div class="line"><a id="l00459" name="l00459"></a><span class="lineno"> 459</span> }</div>
<div class="line"><a id="l00460" name="l00460"></a><span class="lineno"> 460</span> </div>
<div class="line"><a id="l00461" name="l00461"></a><span class="lineno"> 461</span> result.set_candidate_type(candidate_type);</div>
<div class="line"><a id="l00462" name="l00462"></a><span class="lineno"> 462</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l00463" name="l00463"></a><span class="lineno"> 463</span>}</div>
<div class="line"><a id="l00464" name="l00464"></a><span class="lineno"> 464</span> </div>
<div class="line"><a id="l00465" name="l00465"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1pdlp.html#a31aa44a967ce3e99c705e97da796aea0"> 465</a></span>ConvergenceInformation <a class="code hl_function" href="namespaceoperations__research_1_1pdlp.html#a31aa44a967ce3e99c705e97da796aea0">ComputeScaledConvergenceInformation</a>(</div>
<div class="line"><a id="l00466" name="l00466"></a><span class="lineno"> 466</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html">ShardedQuadraticProgram</a>&amp; sharded_qp, <span class="keyword">const</span> VectorXd&amp; primal_solution,</div>
<div class="line"><a id="l00467" name="l00467"></a><span class="lineno"> 467</span> <span class="keyword">const</span> VectorXd&amp; dual_solution, PointType candidate_type) {</div>
<div class="line"><a id="l00468" name="l00468"></a><span class="lineno"> 468</span> <span class="keywordflow">return</span> <a class="code hl_function" href="namespaceoperations__research_1_1pdlp.html#ac77694ebaac0adfa0fce8422782c48c8">ComputeConvergenceInformation</a>(</div>
<div class="line"><a id="l00469" name="l00469"></a><span class="lineno"> 469</span> sharded_qp, VectorXd::Ones(sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#ab945b88f1937277a896d4c7c7935d605">PrimalSize</a>()),</div>
<div class="line"><a id="l00470" name="l00470"></a><span class="lineno"> 470</span> VectorXd::Ones(sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#afcafa95b1a351212291c7a030deec52a">DualSize</a>()), primal_solution, dual_solution,</div>
<div class="line"><a id="l00471" name="l00471"></a><span class="lineno"> 471</span> candidate_type);</div>
<div class="line"><a id="l00472" name="l00472"></a><span class="lineno"> 472</span>}</div>
<div class="line"><a id="l00473" name="l00473"></a><span class="lineno"> 473</span> </div>
<div class="line"><a id="l00474" name="l00474"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1pdlp.html#a64bfea523f69cba6f7be8ac302c18f2f"> 474</a></span>VectorXd <a class="code hl_function" href="namespaceoperations__research_1_1pdlp.html#a64bfea523f69cba6f7be8ac302c18f2f">ReducedCosts</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html">ShardedQuadraticProgram</a>&amp; sharded_qp,</div>
<div class="line"><a id="l00475" name="l00475"></a><span class="lineno"> 475</span> <span class="keyword">const</span> VectorXd&amp; primal_solution,</div>
<div class="line"><a id="l00476" name="l00476"></a><span class="lineno"> 476</span> <span class="keyword">const</span> VectorXd&amp; dual_solution,</div>
<div class="line"><a id="l00477" name="l00477"></a><span class="lineno"> 477</span> <span class="keywordtype">bool</span> use_zero_primal_objective) {</div>
<div class="line"><a id="l00478" name="l00478"></a><span class="lineno"> 478</span> VectorXd objective_product;</div>
<div class="line"><a id="l00479" name="l00479"></a><span class="lineno"> 479</span> <span class="keywordflow">if</span> (use_zero_primal_objective) {</div>
<div class="line"><a id="l00480" name="l00480"></a><span class="lineno"> 480</span> objective_product = <a class="code hl_function" href="namespaceoperations__research.html#a5a9881f8a07b166ef2cbde572cea27b6">VectorXd::Zero</a>(sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#ab945b88f1937277a896d4c7c7935d605">PrimalSize</a>());</div>
<div class="line"><a id="l00481" name="l00481"></a><span class="lineno"> 481</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00482" name="l00482"></a><span class="lineno"> 482</span> objective_product = ObjectiveProduct(sharded_qp, primal_solution);</div>
<div class="line"><a id="l00483" name="l00483"></a><span class="lineno"> 483</span> }</div>
<div class="line"><a id="l00484" name="l00484"></a><span class="lineno"> 484</span> VectorXd reduced_costs = PrimalGradientFromObjectiveProduct(</div>
<div class="line"><a id="l00485" name="l00485"></a><span class="lineno"> 485</span> sharded_qp, dual_solution, std::move(objective_product),</div>
<div class="line"><a id="l00486" name="l00486"></a><span class="lineno"> 486</span> use_zero_primal_objective);</div>
<div class="line"><a id="l00487" name="l00487"></a><span class="lineno"> 487</span> sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#ab7ab55f549e3f9c1a1c8c8d2b766f75b">PrimalSharder</a>().<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharder.html#a5bbfc4ed3da7a0815ba5f6c7ddee320b">ParallelForEachShard</a>(</div>
<div class="line"><a id="l00488" name="l00488"></a><span class="lineno"> 488</span> [&amp;](<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1pdlp_1_1_sharder_1_1_shard.html">Sharder::Shard</a>&amp; shard) {</div>
<div class="line"><a id="l00489" name="l00489"></a><span class="lineno"> 489</span> <span class="keyword">auto</span> rc_shard = shard(reduced_costs);</div>
<div class="line"><a id="l00490" name="l00490"></a><span class="lineno"> 490</span> <span class="keyword">const</span> <span class="keyword">auto</span> lower_bound_shard =</div>
<div class="line"><a id="l00491" name="l00491"></a><span class="lineno"> 491</span> shard(sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#abfdc79e4b2325ff283b7d2333d40fffe">Qp</a>().<a class="code hl_variable" href="structoperations__research_1_1pdlp_1_1_quadratic_program.html#a0f72e7b49f91d0b980f5a54a18c06964">variable_lower_bounds</a>);</div>
<div class="line"><a id="l00492" name="l00492"></a><span class="lineno"> 492</span> <span class="keyword">const</span> <span class="keyword">auto</span> upper_bound_shard =</div>
<div class="line"><a id="l00493" name="l00493"></a><span class="lineno"> 493</span> shard(sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#abfdc79e4b2325ff283b7d2333d40fffe">Qp</a>().<a class="code hl_variable" href="structoperations__research_1_1pdlp_1_1_quadratic_program.html#a097d329b7af662bea9b5a8e310a22726">variable_upper_bounds</a>);</div>
<div class="line"><a id="l00494" name="l00494"></a><span class="lineno"> 494</span> <span class="keyword">const</span> <span class="keyword">auto</span> primal_solution_shard = shard(primal_solution);</div>
<div class="line"><a id="l00495" name="l00495"></a><span class="lineno"> 495</span> <span class="keywordflow">for</span> (int64_t i = 0; i &lt; rc_shard.size(); ++i) {</div>
<div class="line"><a id="l00496" name="l00496"></a><span class="lineno"> 496</span> <span class="keywordflow">if</span> (rc_shard[i] != 0.0 &amp;&amp;</div>
<div class="line"><a id="l00497" name="l00497"></a><span class="lineno"> 497</span> !HandlePrimalGradientTermAsReducedCost(</div>
<div class="line"><a id="l00498" name="l00498"></a><span class="lineno"> 498</span> rc_shard[i], primal_solution_shard[i], lower_bound_shard[i],</div>
<div class="line"><a id="l00499" name="l00499"></a><span class="lineno"> 499</span> upper_bound_shard[i])) {</div>
<div class="line"><a id="l00500" name="l00500"></a><span class="lineno"> 500</span> rc_shard[i] = 0.0;</div>
<div class="line"><a id="l00501" name="l00501"></a><span class="lineno"> 501</span> }</div>
<div class="line"><a id="l00502" name="l00502"></a><span class="lineno"> 502</span> }</div>
<div class="line"><a id="l00503" name="l00503"></a><span class="lineno"> 503</span> });</div>
<div class="line"><a id="l00504" name="l00504"></a><span class="lineno"> 504</span> <span class="keywordflow">return</span> reduced_costs;</div>
<div class="line"><a id="l00505" name="l00505"></a><span class="lineno"> 505</span>}</div>
<div class="line"><a id="l00506" name="l00506"></a><span class="lineno"> 506</span> </div>
<div class="line"><a id="l00507" name="l00507"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1pdlp.html#a7b93e1d980b7d8112423361ac15a0c28"> 507</a></span>absl::optional&lt;ConvergenceInformation&gt; <a class="code hl_function" href="namespaceoperations__research_1_1pdlp.html#a7b93e1d980b7d8112423361ac15a0c28">GetConvergenceInformation</a>(</div>
<div class="line"><a id="l00508" name="l00508"></a><span class="lineno"> 508</span> <span class="keyword">const</span> IterationStats&amp; stats, PointType candidate_type) {</div>
<div class="line"><a id="l00509" name="l00509"></a><span class="lineno"> 509</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; convergence_information : stats.convergence_information()) {</div>
<div class="line"><a id="l00510" name="l00510"></a><span class="lineno"> 510</span> <span class="keywordflow">if</span> (convergence_information.candidate_type() == candidate_type) {</div>
<div class="line"><a id="l00511" name="l00511"></a><span class="lineno"> 511</span> <span class="keywordflow">return</span> convergence_information;</div>
<div class="line"><a id="l00512" name="l00512"></a><span class="lineno"> 512</span> }</div>
<div class="line"><a id="l00513" name="l00513"></a><span class="lineno"> 513</span> }</div>
<div class="line"><a id="l00514" name="l00514"></a><span class="lineno"> 514</span> <span class="keywordflow">return</span> absl::nullopt;</div>
<div class="line"><a id="l00515" name="l00515"></a><span class="lineno"> 515</span>}</div>
<div class="line"><a id="l00516" name="l00516"></a><span class="lineno"> 516</span> </div>
<div class="line"><a id="l00517" name="l00517"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1pdlp.html#a99ed15089cb2d18e7abb0d146aa5f487"> 517</a></span>absl::optional&lt;InfeasibilityInformation&gt; <a class="code hl_function" href="namespaceoperations__research_1_1pdlp.html#a99ed15089cb2d18e7abb0d146aa5f487">GetInfeasibilityInformation</a>(</div>
<div class="line"><a id="l00518" name="l00518"></a><span class="lineno"> 518</span> <span class="keyword">const</span> IterationStats&amp; stats, PointType candidate_type) {</div>
<div class="line"><a id="l00519" name="l00519"></a><span class="lineno"> 519</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; infeasibility_information :</div>
<div class="line"><a id="l00520" name="l00520"></a><span class="lineno"> 520</span> stats.infeasibility_information()) {</div>
<div class="line"><a id="l00521" name="l00521"></a><span class="lineno"> 521</span> <span class="keywordflow">if</span> (infeasibility_information.candidate_type() == candidate_type) {</div>
<div class="line"><a id="l00522" name="l00522"></a><span class="lineno"> 522</span> <span class="keywordflow">return</span> infeasibility_information;</div>
<div class="line"><a id="l00523" name="l00523"></a><span class="lineno"> 523</span> }</div>
<div class="line"><a id="l00524" name="l00524"></a><span class="lineno"> 524</span> }</div>
<div class="line"><a id="l00525" name="l00525"></a><span class="lineno"> 525</span> <span class="keywordflow">return</span> absl::nullopt;</div>
<div class="line"><a id="l00526" name="l00526"></a><span class="lineno"> 526</span>}</div>
<div class="line"><a id="l00527" name="l00527"></a><span class="lineno"> 527</span> </div>
<div class="line"><a id="l00528" name="l00528"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1pdlp.html#a67c368ee96f024040259d5278775c1aa"> 528</a></span>absl::optional&lt;PointMetadata&gt; <a class="code hl_function" href="namespaceoperations__research_1_1pdlp.html#a67c368ee96f024040259d5278775c1aa">GetPointMetadata</a>(<span class="keyword">const</span> IterationStats&amp; stats,</div>
<div class="line"><a id="l00529" name="l00529"></a><span class="lineno"> 529</span> <span class="keyword">const</span> PointType point_type) {</div>
<div class="line"><a id="l00530" name="l00530"></a><span class="lineno"> 530</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; metadata : stats.point_metadata()) {</div>
<div class="line"><a id="l00531" name="l00531"></a><span class="lineno"> 531</span> <span class="keywordflow">if</span> (metadata.point_type() == point_type) {</div>
<div class="line"><a id="l00532" name="l00532"></a><span class="lineno"> 532</span> <span class="keywordflow">return</span> metadata;</div>
<div class="line"><a id="l00533" name="l00533"></a><span class="lineno"> 533</span> }</div>
<div class="line"><a id="l00534" name="l00534"></a><span class="lineno"> 534</span> }</div>
<div class="line"><a id="l00535" name="l00535"></a><span class="lineno"> 535</span> <span class="keywordflow">return</span> absl::nullopt;</div>
<div class="line"><a id="l00536" name="l00536"></a><span class="lineno"> 536</span>}</div>
<div class="line"><a id="l00537" name="l00537"></a><span class="lineno"> 537</span> </div>
<div class="line"><a id="l00538" name="l00538"></a><span class="lineno"><a class="line" href="namespaceoperations__research_1_1pdlp.html#a85cd9828e35e9f00a622d0376bc81325"> 538</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research_1_1pdlp.html#a85cd9828e35e9f00a622d0376bc81325">SetRandomProjections</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html">ShardedQuadraticProgram</a>&amp; sharded_qp,</div>
<div class="line"><a id="l00539" name="l00539"></a><span class="lineno"> 539</span> <span class="keyword">const</span> Eigen::VectorXd&amp; primal_solution,</div>
<div class="line"><a id="l00540" name="l00540"></a><span class="lineno"> 540</span> <span class="keyword">const</span> Eigen::VectorXd&amp; dual_solution,</div>
<div class="line"><a id="l00541" name="l00541"></a><span class="lineno"> 541</span> <span class="keyword">const</span> std::vector&lt;int&gt;&amp; random_projection_seeds,</div>
<div class="line"><a id="l00542" name="l00542"></a><span class="lineno"> 542</span> PointMetadata&amp; metadata) {</div>
<div class="line"><a id="l00543" name="l00543"></a><span class="lineno"> 543</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> random_projection_seed : random_projection_seeds) {</div>
<div class="line"><a id="l00544" name="l00544"></a><span class="lineno"> 544</span> std::mt19937 seed_generator(random_projection_seed);</div>
<div class="line"><a id="l00545" name="l00545"></a><span class="lineno"> 545</span> metadata.mutable_random_primal_projections()-&gt;Add(RandomProjection(</div>
<div class="line"><a id="l00546" name="l00546"></a><span class="lineno"> 546</span> primal_solution, sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#ab7ab55f549e3f9c1a1c8c8d2b766f75b">PrimalSharder</a>(), seed_generator));</div>
<div class="line"><a id="l00547" name="l00547"></a><span class="lineno"> 547</span> metadata.mutable_random_dual_projections()-&gt;Add(RandomProjection(</div>
<div class="line"><a id="l00548" name="l00548"></a><span class="lineno"> 548</span> dual_solution, sharded_qp.<a class="code hl_function" href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#a101ca40b60dd25bbf6271bef1370e8d1">DualSharder</a>(), seed_generator));</div>
<div class="line"><a id="l00549" name="l00549"></a><span class="lineno"> 549</span> }</div>
<div class="line"><a id="l00550" name="l00550"></a><span class="lineno"> 550</span>}</div>
<div class="line"><a id="l00551" name="l00551"></a><span class="lineno"> 551</span> </div>
<div class="line"><a id="l00552" name="l00552"></a><span class="lineno"> 552</span>} <span class="comment">// namespace operations_research::pdlp</span></div>
<div class="ttc" id="aalldiff__cst_8cc_html_a26e6db9bcc64b584051ecc28171ed11f"><div class="ttname"><a href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">max</a></div><div class="ttdeci">int64_t max</div><div class="ttdef"><b>Definition:</b> <a href="alldiff__cst_8cc_source.html#l00140">alldiff_cst.cc:140</a></div></div>
<div class="ttc" id="abase_2logging_8h_html"><div class="ttname"><a href="base_2logging_8h.html">logging.h</a></div></div>
<div class="ttc" id="abase_2logging_8h_html_a7c0ce053b28d53aa4eaf3eb7fb71663b"><div class="ttname"><a href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a></div><div class="ttdeci">#define CHECK_EQ(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00703">base/logging.h:703</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1_math_util_html_aac72849250cdf23aefdd991eb0fc0385"><div class="ttname"><a href="classoperations__research_1_1_math_util.html#aac72849250cdf23aefdd991eb0fc0385">operations_research::MathUtil::Square</a></div><div class="ttdeci">static T Square(const T x)</div><div class="ttdef"><b>Definition:</b> <a href="mathutil_8h_source.html#l00101">mathutil.h:101</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1pdlp_1_1_sharded_quadratic_program_html"><div class="ttname"><a href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html">operations_research::pdlp::ShardedQuadraticProgram</a></div><div class="ttdef"><b>Definition:</b> <a href="sharded__quadratic__program_8h_source.html#l00033">sharded_quadratic_program.h:33</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1pdlp_1_1_sharded_quadratic_program_html_a101ca40b60dd25bbf6271bef1370e8d1"><div class="ttname"><a href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#a101ca40b60dd25bbf6271bef1370e8d1">operations_research::pdlp::ShardedQuadraticProgram::DualSharder</a></div><div class="ttdeci">const Sharder &amp; DualSharder() const</div><div class="ttdef"><b>Definition:</b> <a href="sharded__quadratic__program_8h_source.html#l00064">sharded_quadratic_program.h:64</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1pdlp_1_1_sharded_quadratic_program_html_ab7ab55f549e3f9c1a1c8c8d2b766f75b"><div class="ttname"><a href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#ab7ab55f549e3f9c1a1c8c8d2b766f75b">operations_research::pdlp::ShardedQuadraticProgram::PrimalSharder</a></div><div class="ttdeci">const Sharder &amp; PrimalSharder() const</div><div class="ttdef"><b>Definition:</b> <a href="sharded__quadratic__program_8h_source.html#l00062">sharded_quadratic_program.h:62</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1pdlp_1_1_sharded_quadratic_program_html_ab945b88f1937277a896d4c7c7935d605"><div class="ttname"><a href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#ab945b88f1937277a896d4c7c7935d605">operations_research::pdlp::ShardedQuadraticProgram::PrimalSize</a></div><div class="ttdeci">int64_t PrimalSize() const</div><div class="ttdef"><b>Definition:</b> <a href="sharded__quadratic__program_8h_source.html#l00066">sharded_quadratic_program.h:66</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1pdlp_1_1_sharded_quadratic_program_html_abfdc79e4b2325ff283b7d2333d40fffe"><div class="ttname"><a href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#abfdc79e4b2325ff283b7d2333d40fffe">operations_research::pdlp::ShardedQuadraticProgram::Qp</a></div><div class="ttdeci">const QuadraticProgram &amp; Qp() const</div><div class="ttdef"><b>Definition:</b> <a href="sharded__quadratic__program_8h_source.html#l00045">sharded_quadratic_program.h:45</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1pdlp_1_1_sharded_quadratic_program_html_afcafa95b1a351212291c7a030deec52a"><div class="ttname"><a href="classoperations__research_1_1pdlp_1_1_sharded_quadratic_program.html#afcafa95b1a351212291c7a030deec52a">operations_research::pdlp::ShardedQuadraticProgram::DualSize</a></div><div class="ttdeci">int64_t DualSize() const</div><div class="ttdef"><b>Definition:</b> <a href="sharded__quadratic__program_8h_source.html#l00067">sharded_quadratic_program.h:67</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1pdlp_1_1_sharder_1_1_shard_html"><div class="ttname"><a href="classoperations__research_1_1pdlp_1_1_sharder_1_1_shard.html">operations_research::pdlp::Sharder::Shard</a></div><div class="ttdef"><b>Definition:</b> <a href="sharder_8h_source.html#l00055">sharder.h:55</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1pdlp_1_1_sharder_1_1_shard_html_a8ef12397d1682615bc3108c397734179"><div class="ttname"><a href="classoperations__research_1_1pdlp_1_1_sharder_1_1_shard.html#a8ef12397d1682615bc3108c397734179">operations_research::pdlp::Sharder::Shard::Index</a></div><div class="ttdeci">int Index() const</div><div class="ttdef"><b>Definition:</b> <a href="sharder_8h_source.html#l00127">sharder.h:127</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1pdlp_1_1_sharder_html_a5bbfc4ed3da7a0815ba5f6c7ddee320b"><div class="ttname"><a href="classoperations__research_1_1pdlp_1_1_sharder.html#a5bbfc4ed3da7a0815ba5f6c7ddee320b">operations_research::pdlp::Sharder::ParallelForEachShard</a></div><div class="ttdeci">void ParallelForEachShard(const std::function&lt; void(const Shard &amp;)&gt; &amp;func) const</div><div class="ttdef"><b>Definition:</b> <a href="sharder_8cc_source.html#l00097">sharder.cc:97</a></div></div>
<div class="ttc" id="aclassoperations__research_1_1pdlp_1_1_sharder_html_aa6c18d04d5fcbe7a9343768b8b66be7f"><div class="ttname"><a href="classoperations__research_1_1pdlp_1_1_sharder.html#aa6c18d04d5fcbe7a9343768b8b66be7f">operations_research::pdlp::Sharder::NumShards</a></div><div class="ttdeci">int NumShards() const</div><div class="ttdef"><b>Definition:</b> <a href="sharder_8h_source.html#l00181">sharder.h:181</a></div></div>
<div class="ttc" id="agscip__solver_8cc_html_a1ba5ca0f61f2fa13bd23bf0f89004f35"><div class="ttname"><a href="gscip__solver_8cc.html#a1ba5ca0f61f2fa13bd23bf0f89004f35">upper_bound</a></div><div class="ttdeci">double upper_bound</div><div class="ttdef"><b>Definition:</b> <a href="gscip__solver_8cc_source.html#l00137">gscip_solver.cc:137</a></div></div>
<div class="ttc" id="agscip__solver_8cc_html_a1e2f9a2352c1d9a6cada9544898fceec"><div class="ttname"><a href="gscip__solver_8cc.html#a1e2f9a2352c1d9a6cada9544898fceec">lower_bound</a></div><div class="ttdeci">double lower_bound</div><div class="ttdef"><b>Definition:</b> <a href="gscip__solver_8cc_source.html#l00136">gscip_solver.cc:136</a></div></div>
<div class="ttc" id="aiteration__stats_8cc_html_a16548fbf63af658d61de20a71baded7a"><div class="ttname"><a href="iteration__stats_8cc.html#a16548fbf63af658d61de20a71baded7a">l_2_residual</a></div><div class="ttdeci">double l_2_residual</div><div class="ttdef"><b>Definition:</b> <a href="iteration__stats_8cc_source.html#l00056">iteration_stats.cc:56</a></div></div>
<div class="ttc" id="aiteration__stats_8cc_html_a16e7df0f7c2a47748aaf9004258c6b13"><div class="ttname"><a href="iteration__stats_8cc.html#a16e7df0f7c2a47748aaf9004258c6b13">objective_full_correction</a></div><div class="ttdeci">double objective_full_correction</div><div class="ttdef"><b>Definition:</b> <a href="iteration__stats_8cc_source.html#l00054">iteration_stats.cc:54</a></div></div>
<div class="ttc" id="aiteration__stats_8cc_html_a28460a7fdcd91c3a3a95b2b74aff7bb7"><div class="ttname"><a href="iteration__stats_8cc.html#a28460a7fdcd91c3a3a95b2b74aff7bb7">objective_correction</a></div><div class="ttdeci">double objective_correction</div><div class="ttdef"><b>Definition:</b> <a href="iteration__stats_8cc_source.html#l00053">iteration_stats.cc:53</a></div></div>
<div class="ttc" id="aiteration__stats_8cc_html_aa731e3486184edfd00ea54e3a288175f"><div class="ttname"><a href="iteration__stats_8cc.html#aa731e3486184edfd00ea54e3a288175f">l_inf_residual</a></div><div class="ttdeci">double l_inf_residual</div><div class="ttdef"><b>Definition:</b> <a href="iteration__stats_8cc_source.html#l00055">iteration_stats.cc:55</a></div></div>
<div class="ttc" id="aiteration__stats_8h_html"><div class="ttname"><a href="iteration__stats_8h.html">iteration_stats.h</a></div></div>
<div class="ttc" id="amathutil_8h_html"><div class="ttname"><a href="mathutil_8h.html">mathutil.h</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1pdlp_html"><div class="ttname"><a href="namespaceoperations__research_1_1pdlp.html">operations_research::pdlp</a></div><div class="ttdef"><b>Definition:</b> <a href="iteration__stats_8cc_source.html#l00040">iteration_stats.cc:40</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1pdlp_html_a0b812156619599417e29521a41b7a734"><div class="ttname"><a href="namespaceoperations__research_1_1pdlp.html#a0b812156619599417e29521a41b7a734">operations_research::pdlp::ScaledNorm</a></div><div class="ttdeci">double ScaledNorm(const VectorXd &amp;vector, const VectorXd &amp;scale, const Sharder &amp;sharder)</div><div class="ttdef"><b>Definition:</b> <a href="sharder_8cc_source.html#l00253">sharder.cc:253</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1pdlp_html_a11831586b99d28a708bc103bce1a945e"><div class="ttname"><a href="namespaceoperations__research_1_1pdlp.html#a11831586b99d28a708bc103bce1a945e">operations_research::pdlp::Dot</a></div><div class="ttdeci">double Dot(const VectorXd &amp;v1, const VectorXd &amp;v2, const Sharder &amp;sharder)</div><div class="ttdef"><b>Definition:</b> <a href="sharder_8cc_source.html#l00197">sharder.cc:197</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1pdlp_html_a31aa44a967ce3e99c705e97da796aea0"><div class="ttname"><a href="namespaceoperations__research_1_1pdlp.html#a31aa44a967ce3e99c705e97da796aea0">operations_research::pdlp::ComputeScaledConvergenceInformation</a></div><div class="ttdeci">ConvergenceInformation ComputeScaledConvergenceInformation(const ShardedQuadraticProgram &amp;sharded_qp, const VectorXd &amp;primal_solution, const VectorXd &amp;dual_solution, PointType candidate_type)</div><div class="ttdef"><b>Definition:</b> <a href="iteration__stats_8cc_source.html#l00465">iteration_stats.cc:465</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1pdlp_html_a33a42241df5501b0165ee77c3de54d7f"><div class="ttname"><a href="namespaceoperations__research_1_1pdlp.html#a33a42241df5501b0165ee77c3de54d7f">operations_research::pdlp::LInfNorm</a></div><div class="ttdeci">double LInfNorm(const VectorXd &amp;vector, const Sharder &amp;sharder)</div><div class="ttdef"><b>Definition:</b> <a href="sharder_8cc_source.html#l00202">sharder.cc:202</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1pdlp_html_a463586ded0a114d3ca4b97a048d37d8a"><div class="ttname"><a href="namespaceoperations__research_1_1pdlp.html#a463586ded0a114d3ca4b97a048d37d8a">operations_research::pdlp::TransposedMatrixVectorProduct</a></div><div class="ttdeci">VectorXd TransposedMatrixVectorProduct(const Eigen::SparseMatrix&lt; double, Eigen::ColMajor, int64_t &gt; &amp;matrix, const VectorXd &amp;vector, const Sharder &amp;sharder)</div><div class="ttdef"><b>Definition:</b> <a href="sharder_8cc_source.html#l00151">sharder.cc:151</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1pdlp_html_a55b8c43a5adfafddb030074c75aeef70"><div class="ttname"><a href="namespaceoperations__research_1_1pdlp.html#a55b8c43a5adfafddb030074c75aeef70">operations_research::pdlp::ScaledLInfNorm</a></div><div class="ttdeci">double ScaledLInfNorm(const VectorXd &amp;vector, const VectorXd &amp;scale, const Sharder &amp;sharder)</div><div class="ttdef"><b>Definition:</b> <a href="sharder_8cc_source.html#l00236">sharder.cc:236</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1pdlp_html_a64bfea523f69cba6f7be8ac302c18f2f"><div class="ttname"><a href="namespaceoperations__research_1_1pdlp.html#a64bfea523f69cba6f7be8ac302c18f2f">operations_research::pdlp::ReducedCosts</a></div><div class="ttdeci">VectorXd ReducedCosts(const ShardedQuadraticProgram &amp;sharded_qp, const VectorXd &amp;primal_solution, const VectorXd &amp;dual_solution, bool use_zero_primal_objective)</div><div class="ttdef"><b>Definition:</b> <a href="iteration__stats_8cc_source.html#l00474">iteration_stats.cc:474</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1pdlp_html_a67c368ee96f024040259d5278775c1aa"><div class="ttname"><a href="namespaceoperations__research_1_1pdlp.html#a67c368ee96f024040259d5278775c1aa">operations_research::pdlp::GetPointMetadata</a></div><div class="ttdeci">absl::optional&lt; PointMetadata &gt; GetPointMetadata(const IterationStats &amp;stats, const PointType point_type)</div><div class="ttdef"><b>Definition:</b> <a href="iteration__stats_8cc_source.html#l00528">iteration_stats.cc:528</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1pdlp_html_a74af5ceb7b6e37fbfca92e2c59b99e3e"><div class="ttname"><a href="namespaceoperations__research_1_1pdlp.html#a74af5ceb7b6e37fbfca92e2c59b99e3e">operations_research::pdlp::ComputeInfeasibilityInformation</a></div><div class="ttdeci">InfeasibilityInformation ComputeInfeasibilityInformation(const ShardedQuadraticProgram &amp;scaled_sharded_qp, const Eigen::VectorXd &amp;col_scaling_vec, const Eigen::VectorXd &amp;row_scaling_vec, const Eigen::VectorXd &amp;scaled_primal_ray, const Eigen::VectorXd &amp;scaled_dual_ray, PointType candidate_type)</div><div class="ttdef"><b>Definition:</b> <a href="iteration__stats_8cc_source.html#l00372">iteration_stats.cc:372</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1pdlp_html_a7b93e1d980b7d8112423361ac15a0c28"><div class="ttname"><a href="namespaceoperations__research_1_1pdlp.html#a7b93e1d980b7d8112423361ac15a0c28">operations_research::pdlp::GetConvergenceInformation</a></div><div class="ttdeci">absl::optional&lt; ConvergenceInformation &gt; GetConvergenceInformation(const IterationStats &amp;stats, PointType candidate_type)</div><div class="ttdef"><b>Definition:</b> <a href="iteration__stats_8cc_source.html#l00507">iteration_stats.cc:507</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1pdlp_html_a850865b3deabb2a623e130691df99f15"><div class="ttname"><a href="namespaceoperations__research_1_1pdlp.html#a850865b3deabb2a623e130691df99f15">operations_research::pdlp::IsLinearProgram</a></div><div class="ttdeci">bool IsLinearProgram(const QuadraticProgram &amp;qp)</div><div class="ttdef"><b>Definition:</b> <a href="quadratic__program_8h_source.html#l00150">quadratic_program.h:150</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1pdlp_html_a85cd9828e35e9f00a622d0376bc81325"><div class="ttname"><a href="namespaceoperations__research_1_1pdlp.html#a85cd9828e35e9f00a622d0376bc81325">operations_research::pdlp::SetRandomProjections</a></div><div class="ttdeci">void SetRandomProjections(const ShardedQuadraticProgram &amp;sharded_qp, const Eigen::VectorXd &amp;primal_solution, const Eigen::VectorXd &amp;dual_solution, const std::vector&lt; int &gt; &amp;random_projection_seeds, PointMetadata &amp;metadata)</div><div class="ttdef"><b>Definition:</b> <a href="iteration__stats_8cc_source.html#l00538">iteration_stats.cc:538</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1pdlp_html_a99ed15089cb2d18e7abb0d146aa5f487"><div class="ttname"><a href="namespaceoperations__research_1_1pdlp.html#a99ed15089cb2d18e7abb0d146aa5f487">operations_research::pdlp::GetInfeasibilityInformation</a></div><div class="ttdeci">absl::optional&lt; InfeasibilityInformation &gt; GetInfeasibilityInformation(const IterationStats &amp;stats, PointType candidate_type)</div><div class="ttdef"><b>Definition:</b> <a href="iteration__stats_8cc_source.html#l00517">iteration_stats.cc:517</a></div></div>
<div class="ttc" id="anamespaceoperations__research_1_1pdlp_html_ac77694ebaac0adfa0fce8422782c48c8"><div class="ttname"><a href="namespaceoperations__research_1_1pdlp.html#ac77694ebaac0adfa0fce8422782c48c8">operations_research::pdlp::ComputeConvergenceInformation</a></div><div class="ttdeci">ConvergenceInformation ComputeConvergenceInformation(const ShardedQuadraticProgram &amp;scaled_sharded_qp, const Eigen::VectorXd &amp;col_scaling_vec, const Eigen::VectorXd &amp;row_scaling_vec, const Eigen::VectorXd &amp;scaled_primal_solution, const Eigen::VectorXd &amp;scaled_dual_solution, PointType candidate_type)</div><div class="ttdef"><b>Definition:</b> <a href="iteration__stats_8cc_source.html#l00308">iteration_stats.cc:308</a></div></div>
<div class="ttc" id="anamespaceoperations__research_html_a5a9881f8a07b166ef2cbde572cea27b6"><div class="ttname"><a href="namespaceoperations__research.html#a5a9881f8a07b166ef2cbde572cea27b6">operations_research::Zero</a></div><div class="ttdeci">int64_t Zero()</div><div class="ttdoc">NOLINT.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l03161">constraint_solver.h:3161</a></div></div>
<div class="ttc" id="aquadratic__program_8h_html"><div class="ttname"><a href="quadratic__program_8h.html">quadratic_program.h</a></div></div>
<div class="ttc" id="asharded__quadratic__program_8h_html"><div class="ttname"><a href="sharded__quadratic__program_8h.html">sharded_quadratic_program.h</a></div></div>
<div class="ttc" id="asharder_8h_html"><div class="ttname"><a href="sharder_8h.html">sharder.h</a></div></div>
<div class="ttc" id="astructoperations__research_1_1pdlp_1_1_quadratic_program_html"><div class="ttname"><a href="structoperations__research_1_1pdlp_1_1_quadratic_program.html">operations_research::pdlp::QuadraticProgram</a></div><div class="ttdef"><b>Definition:</b> <a href="quadratic__program_8h_source.html#l00054">quadratic_program.h:54</a></div></div>
<div class="ttc" id="astructoperations__research_1_1pdlp_1_1_quadratic_program_html_a097d329b7af662bea9b5a8e310a22726"><div class="ttname"><a href="structoperations__research_1_1pdlp_1_1_quadratic_program.html#a097d329b7af662bea9b5a8e310a22726">operations_research::pdlp::QuadraticProgram::variable_upper_bounds</a></div><div class="ttdeci">Eigen::VectorXd variable_upper_bounds</div><div class="ttdef"><b>Definition:</b> <a href="quadratic__program_8h_source.html#l00133">quadratic_program.h:133</a></div></div>
<div class="ttc" id="astructoperations__research_1_1pdlp_1_1_quadratic_program_html_a0f72e7b49f91d0b980f5a54a18c06964"><div class="ttname"><a href="structoperations__research_1_1pdlp_1_1_quadratic_program.html#a0f72e7b49f91d0b980f5a54a18c06964">operations_research::pdlp::QuadraticProgram::variable_lower_bounds</a></div><div class="ttdeci">Eigen::VectorXd variable_lower_bounds</div><div class="ttdef"><b>Definition:</b> <a href="quadratic__program_8h_source.html#l00133">quadratic_program.h:133</a></div></div>
<div class="ttc" id="astructoperations__research_1_1pdlp_1_1_quadratic_program_html_a2d3828418aef02f4f8897c2d3db75b2f"><div class="ttname"><a href="structoperations__research_1_1pdlp_1_1_quadratic_program.html#a2d3828418aef02f4f8897c2d3db75b2f">operations_research::pdlp::QuadraticProgram::ApplyObjectiveScalingAndOffset</a></div><div class="ttdeci">double ApplyObjectiveScalingAndOffset(double objective) const</div><div class="ttdef"><b>Definition:</b> <a href="quadratic__program_8h_source.html#l00123">quadratic_program.h:123</a></div></div>
<div class="ttc" id="astructoperations__research_1_1pdlp_1_1_quadratic_program_html_afdb3e07cd380793e1b265c1fded94edd"><div class="ttname"><a href="structoperations__research_1_1pdlp_1_1_quadratic_program.html#afdb3e07cd380793e1b265c1fded94edd">operations_research::pdlp::QuadraticProgram::objective_vector</a></div><div class="ttdeci">Eigen::VectorXd objective_vector</div><div class="ttdef"><b>Definition:</b> <a href="quadratic__program_8h_source.html#l00127">quadratic_program.h:127</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- HTML footer for doxygen 1.8.18-->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_a7cc1eeded8f693d0da6c729bc88c45a.html">ortools</a></li><li class="navelem"><a class="el" href="dir_7cc48880791e3dd695dbfc2349101d28.html">pdlp</a></li><li class="navelem"><a class="el" href="iteration__stats_8cc.html">iteration_stats.cc</a></li>
<li class="footer">Generated by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.9.3 </li>
</ul>
</div>
</body>
</html>