Documentation updated

This commit is contained in:
fjosw 2022-04-29 14:35:28 +00:00
parent 56c79b7a49
commit 162d449592
2 changed files with 265 additions and 34 deletions

View file

@ -185,6 +185,9 @@
<li>
<a class="variable" href="#Corr.imag">imag</a>
</li>
<li>
<a class="function" href="#Corr.prune">prune</a>
</li>
</ul>
</li>
@ -1312,39 +1315,98 @@
</span><span id="L-1102"><a href="#L-1102"><span class="linenos">1102</span></a>
</span><span id="L-1103"><a href="#L-1103"><span class="linenos">1103</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_apply_func_to_corr</span><span class="p">(</span><span class="n">return_imag</span><span class="p">)</span>
</span><span id="L-1104"><a href="#L-1104"><span class="linenos">1104</span></a>
</span><span id="L-1105"><a href="#L-1105"><span class="linenos">1105</span></a>
</span><span id="L-1106"><a href="#L-1106"><span class="linenos">1106</span></a><span class="k">def</span> <span class="nf">_sort_vectors</span><span class="p">(</span><span class="n">vec_set</span><span class="p">,</span> <span class="n">ts</span><span class="p">):</span>
</span><span id="L-1107"><a href="#L-1107"><span class="linenos">1107</span></a> <span class="sd">&quot;&quot;&quot;Helper function used to find a set of Eigenvectors consistent over all timeslices&quot;&quot;&quot;</span>
</span><span id="L-1108"><a href="#L-1108"><span class="linenos">1108</span></a> <span class="n">reference_sorting</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">vec_set</span><span class="p">[</span><span class="n">ts</span><span class="p">])</span>
</span><span id="L-1109"><a href="#L-1109"><span class="linenos">1109</span></a> <span class="n">N</span> <span class="o">=</span> <span class="n">reference_sorting</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span><span id="L-1110"><a href="#L-1110"><span class="linenos">1110</span></a> <span class="n">sorted_vec_set</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-1111"><a href="#L-1111"><span class="linenos">1111</span></a> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">vec_set</span><span class="p">)):</span>
</span><span id="L-1112"><a href="#L-1112"><span class="linenos">1112</span></a> <span class="k">if</span> <span class="n">vec_set</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-1113"><a href="#L-1113"><span class="linenos">1113</span></a> <span class="n">sorted_vec_set</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span>
</span><span id="L-1114"><a href="#L-1114"><span class="linenos">1114</span></a> <span class="k">elif</span> <span class="ow">not</span> <span class="n">t</span> <span class="o">==</span> <span class="n">ts</span><span class="p">:</span>
</span><span id="L-1115"><a href="#L-1115"><span class="linenos">1115</span></a> <span class="n">perms</span> <span class="o">=</span> <span class="p">[</span><span class="nb">list</span><span class="p">(</span><span class="n">o</span><span class="p">)</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">permutations</span><span class="p">([</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">N</span><span class="p">)],</span> <span class="n">N</span><span class="p">)]</span>
</span><span id="L-1116"><a href="#L-1116"><span class="linenos">1116</span></a> <span class="n">best_score</span> <span class="o">=</span> <span class="mi">0</span>
</span><span id="L-1117"><a href="#L-1117"><span class="linenos">1117</span></a> <span class="k">for</span> <span class="n">perm</span> <span class="ow">in</span> <span class="n">perms</span><span class="p">:</span>
</span><span id="L-1118"><a href="#L-1118"><span class="linenos">1118</span></a> <span class="n">current_score</span> <span class="o">=</span> <span class="mi">1</span>
</span><span id="L-1119"><a href="#L-1119"><span class="linenos">1119</span></a> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">N</span><span class="p">):</span>
</span><span id="L-1120"><a href="#L-1120"><span class="linenos">1120</span></a> <span class="n">new_sorting</span> <span class="o">=</span> <span class="n">reference_sorting</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
</span><span id="L-1121"><a href="#L-1121"><span class="linenos">1121</span></a> <span class="n">new_sorting</span><span class="p">[</span><span class="n">perm</span><span class="p">[</span><span class="n">k</span><span class="p">],</span> <span class="p">:]</span> <span class="o">=</span> <span class="n">vec_set</span><span class="p">[</span><span class="n">t</span><span class="p">][</span><span class="n">k</span><span class="p">]</span>
</span><span id="L-1122"><a href="#L-1122"><span class="linenos">1122</span></a> <span class="n">current_score</span> <span class="o">*=</span> <span class="nb">abs</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">det</span><span class="p">(</span><span class="n">new_sorting</span><span class="p">))</span>
</span><span id="L-1123"><a href="#L-1123"><span class="linenos">1123</span></a> <span class="k">if</span> <span class="n">current_score</span> <span class="o">&gt;</span> <span class="n">best_score</span><span class="p">:</span>
</span><span id="L-1124"><a href="#L-1124"><span class="linenos">1124</span></a> <span class="n">best_score</span> <span class="o">=</span> <span class="n">current_score</span>
</span><span id="L-1125"><a href="#L-1125"><span class="linenos">1125</span></a> <span class="n">best_perm</span> <span class="o">=</span> <span class="n">perm</span>
</span><span id="L-1126"><a href="#L-1126"><span class="linenos">1126</span></a> <span class="n">sorted_vec_set</span><span class="o">.</span><span class="n">append</span><span class="p">([</span><span class="n">vec_set</span><span class="p">[</span><span class="n">t</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">best_perm</span><span class="p">])</span>
</span><span id="L-1127"><a href="#L-1127"><span class="linenos">1127</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-1128"><a href="#L-1128"><span class="linenos">1128</span></a> <span class="n">sorted_vec_set</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">vec_set</span><span class="p">[</span><span class="n">t</span><span class="p">])</span>
</span><span id="L-1129"><a href="#L-1129"><span class="linenos">1129</span></a>
</span><span id="L-1130"><a href="#L-1130"><span class="linenos">1130</span></a> <span class="k">return</span> <span class="n">sorted_vec_set</span>
</span><span id="L-1131"><a href="#L-1131"><span class="linenos">1131</span></a>
</span><span id="L-1132"><a href="#L-1132"><span class="linenos">1132</span></a>
</span><span id="L-1133"><a href="#L-1133"><span class="linenos">1133</span></a><span class="k">def</span> <span class="nf">_GEVP_solver</span><span class="p">(</span><span class="n">Gt</span><span class="p">,</span> <span class="n">G0</span><span class="p">):</span> <span class="c1"># Just so normalization an sorting does not need to be repeated. Here we could later put in some checks</span>
</span><span id="L-1134"><a href="#L-1134"><span class="linenos">1134</span></a> <span class="n">sp_val</span><span class="p">,</span> <span class="n">sp_vecs</span> <span class="o">=</span> <span class="n">scipy</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">eigh</span><span class="p">(</span><span class="n">Gt</span><span class="p">,</span> <span class="n">G0</span><span class="p">)</span>
</span><span id="L-1135"><a href="#L-1135"><span class="linenos">1135</span></a> <span class="n">sp_vecs</span> <span class="o">=</span> <span class="p">[</span><span class="n">sp_vecs</span><span class="p">[:,</span> <span class="n">np</span><span class="o">.</span><span class="n">argsort</span><span class="p">(</span><span class="n">sp_val</span><span class="p">)[</span><span class="o">-</span><span class="n">i</span><span class="p">]]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">sp_vecs</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)]</span>
</span><span id="L-1136"><a href="#L-1136"><span class="linenos">1136</span></a> <span class="n">sp_vecs</span> <span class="o">=</span> <span class="p">[</span><span class="n">v</span> <span class="o">/</span> <span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">((</span><span class="n">v</span><span class="o">.</span><span class="n">T</span> <span class="o">@</span> <span class="n">G0</span> <span class="o">@</span> <span class="n">v</span><span class="p">))</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">sp_vecs</span><span class="p">]</span>
</span><span id="L-1137"><a href="#L-1137"><span class="linenos">1137</span></a> <span class="k">return</span> <span class="n">sp_vecs</span>
</span><span id="L-1105"><a href="#L-1105"><span class="linenos">1105</span></a> <span class="k">def</span> <span class="nf">prune</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">Ntrunc</span><span class="p">,</span> <span class="n">tproj</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">t0proj</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">basematrix</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
</span><span id="L-1106"><a href="#L-1106"><span class="linenos">1106</span></a> <span class="sa">r</span><span class="sd">&#39;&#39;&#39; Project large correlation matrix to lowest states</span>
</span><span id="L-1107"><a href="#L-1107"><span class="linenos">1107</span></a>
</span><span id="L-1108"><a href="#L-1108"><span class="linenos">1108</span></a><span class="sd"> This method can be used to reduce the size of an (N x N) correlation matrix</span>
</span><span id="L-1109"><a href="#L-1109"><span class="linenos">1109</span></a><span class="sd"> to (Ntrunc x Ntrunc) by solving a GEVP at very early times where the noise</span>
</span><span id="L-1110"><a href="#L-1110"><span class="linenos">1110</span></a><span class="sd"> is still small.</span>
</span><span id="L-1111"><a href="#L-1111"><span class="linenos">1111</span></a>
</span><span id="L-1112"><a href="#L-1112"><span class="linenos">1112</span></a><span class="sd"> Parameters</span>
</span><span id="L-1113"><a href="#L-1113"><span class="linenos">1113</span></a><span class="sd"> ----------</span>
</span><span id="L-1114"><a href="#L-1114"><span class="linenos">1114</span></a><span class="sd"> Ntrunc: int</span>
</span><span id="L-1115"><a href="#L-1115"><span class="linenos">1115</span></a><span class="sd"> Rank of the target matrix.</span>
</span><span id="L-1116"><a href="#L-1116"><span class="linenos">1116</span></a><span class="sd"> tproj: int</span>
</span><span id="L-1117"><a href="#L-1117"><span class="linenos">1117</span></a><span class="sd"> Time where the eigenvectors are evaluated, corresponds to ts in the GEVP method.</span>
</span><span id="L-1118"><a href="#L-1118"><span class="linenos">1118</span></a><span class="sd"> The default value is 3.</span>
</span><span id="L-1119"><a href="#L-1119"><span class="linenos">1119</span></a><span class="sd"> t0proj: int</span>
</span><span id="L-1120"><a href="#L-1120"><span class="linenos">1120</span></a><span class="sd"> Time where the correlation matrix is inverted. Choosing t0proj=1 is strongly</span>
</span><span id="L-1121"><a href="#L-1121"><span class="linenos">1121</span></a><span class="sd"> discouraged for O(a) improved theories, since the correctness of the procedure</span>
</span><span id="L-1122"><a href="#L-1122"><span class="linenos">1122</span></a><span class="sd"> cannot be granted in this case. The default value is 2.</span>
</span><span id="L-1123"><a href="#L-1123"><span class="linenos">1123</span></a><span class="sd"> basematrix : Corr</span>
</span><span id="L-1124"><a href="#L-1124"><span class="linenos">1124</span></a><span class="sd"> Correlation matrix that is used to determine the eigenvectors of the</span>
</span><span id="L-1125"><a href="#L-1125"><span class="linenos">1125</span></a><span class="sd"> lowest states based on a GEVP. basematrix is taken to be the Corr itself if</span>
</span><span id="L-1126"><a href="#L-1126"><span class="linenos">1126</span></a><span class="sd"> is is not specified.</span>
</span><span id="L-1127"><a href="#L-1127"><span class="linenos">1127</span></a>
</span><span id="L-1128"><a href="#L-1128"><span class="linenos">1128</span></a><span class="sd"> Notes</span>
</span><span id="L-1129"><a href="#L-1129"><span class="linenos">1129</span></a><span class="sd"> -----</span>
</span><span id="L-1130"><a href="#L-1130"><span class="linenos">1130</span></a><span class="sd"> We have the basematrix $C(t)$ and the target matrix $G(t)$. We start by solving</span>
</span><span id="L-1131"><a href="#L-1131"><span class="linenos">1131</span></a><span class="sd"> the GEVP $$C(t) v_n(t, t_0) = \lambda_n(t, t_0) C(t_0) v_n(t, t_0)$$ where $t \equiv t_\mathrm{proj}$</span>
</span><span id="L-1132"><a href="#L-1132"><span class="linenos">1132</span></a><span class="sd"> and $t_0 \equiv t_{0, \mathrm{proj}}$. The target matrix is projected onto the subspace of the</span>
</span><span id="L-1133"><a href="#L-1133"><span class="linenos">1133</span></a><span class="sd"> resulting eigenvectors $v_n, n=1,\dots,N_\mathrm{trunc}$ via</span>
</span><span id="L-1134"><a href="#L-1134"><span class="linenos">1134</span></a><span class="sd"> $$G^\prime_{i, j}(t) = (v_i, G(t) v_j)$$. This allows to reduce the size of a large</span>
</span><span id="L-1135"><a href="#L-1135"><span class="linenos">1135</span></a><span class="sd"> correlation matrix and to remove some noise that is added by irrelevant operators.</span>
</span><span id="L-1136"><a href="#L-1136"><span class="linenos">1136</span></a><span class="sd"> This may allow to use the GEVP on $G(t)$ at late times such that the theoretically motivated</span>
</span><span id="L-1137"><a href="#L-1137"><span class="linenos">1137</span></a><span class="sd"> bound $t_0 \leq t/2$ holds, since the condition number of $G(t)$ is decreased, compared to $C(t)$.</span>
</span><span id="L-1138"><a href="#L-1138"><span class="linenos">1138</span></a><span class="sd"> &#39;&#39;&#39;</span>
</span><span id="L-1139"><a href="#L-1139"><span class="linenos">1139</span></a>
</span><span id="L-1140"><a href="#L-1140"><span class="linenos">1140</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">N</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="L-1141"><a href="#L-1141"><span class="linenos">1141</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">&#39;Method cannot be applied to one-dimensional correlators.&#39;</span><span class="p">)</span>
</span><span id="L-1142"><a href="#L-1142"><span class="linenos">1142</span></a> <span class="k">if</span> <span class="n">basematrix</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-1143"><a href="#L-1143"><span class="linenos">1143</span></a> <span class="n">basematrix</span> <span class="o">=</span> <span class="bp">self</span>
</span><span id="L-1144"><a href="#L-1144"><span class="linenos">1144</span></a> <span class="k">if</span> <span class="n">Ntrunc</span> <span class="o">&gt;=</span> <span class="n">basematrix</span><span class="o">.</span><span class="n">N</span><span class="p">:</span>
</span><span id="L-1145"><a href="#L-1145"><span class="linenos">1145</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">&#39;Cannot truncate using Ntrunc &lt;= </span><span class="si">%d</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">basematrix</span><span class="o">.</span><span class="n">N</span><span class="p">))</span>
</span><span id="L-1146"><a href="#L-1146"><span class="linenos">1146</span></a> <span class="k">if</span> <span class="n">basematrix</span><span class="o">.</span><span class="n">N</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">N</span><span class="p">:</span>
</span><span id="L-1147"><a href="#L-1147"><span class="linenos">1147</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">&#39;basematrix and targetmatrix have to be of the same size.&#39;</span><span class="p">)</span>
</span><span id="L-1148"><a href="#L-1148"><span class="linenos">1148</span></a>
</span><span id="L-1149"><a href="#L-1149"><span class="linenos">1149</span></a> <span class="n">evecs</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-1150"><a href="#L-1150"><span class="linenos">1150</span></a> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">Ntrunc</span><span class="p">):</span>
</span><span id="L-1151"><a href="#L-1151"><span class="linenos">1151</span></a> <span class="n">evecs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">basematrix</span><span class="o">.</span><span class="n">GEVP</span><span class="p">(</span><span class="n">t0proj</span><span class="p">,</span> <span class="n">tproj</span><span class="p">,</span> <span class="n">state</span><span class="o">=</span><span class="n">i</span><span class="p">))</span>
</span><span id="L-1152"><a href="#L-1152"><span class="linenos">1152</span></a>
</span><span id="L-1153"><a href="#L-1153"><span class="linenos">1153</span></a> <span class="n">tmpmat</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">((</span><span class="n">Ntrunc</span><span class="p">,</span> <span class="n">Ntrunc</span><span class="p">),</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">object</span><span class="p">)</span>
</span><span id="L-1154"><a href="#L-1154"><span class="linenos">1154</span></a> <span class="n">rmat</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-1155"><a href="#L-1155"><span class="linenos">1155</span></a> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">basematrix</span><span class="o">.</span><span class="n">T</span><span class="p">):</span>
</span><span id="L-1156"><a href="#L-1156"><span class="linenos">1156</span></a> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">Ntrunc</span><span class="p">):</span>
</span><span id="L-1157"><a href="#L-1157"><span class="linenos">1157</span></a> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">Ntrunc</span><span class="p">):</span>
</span><span id="L-1158"><a href="#L-1158"><span class="linenos">1158</span></a> <span class="n">tmpmat</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">evecs</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">T</span> <span class="o">@</span> <span class="bp">self</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="o">@</span> <span class="n">evecs</span><span class="p">[</span><span class="n">j</span><span class="p">]</span>
</span><span id="L-1159"><a href="#L-1159"><span class="linenos">1159</span></a> <span class="n">rmat</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">tmpmat</span><span class="p">))</span>
</span><span id="L-1160"><a href="#L-1160"><span class="linenos">1160</span></a>
</span><span id="L-1161"><a href="#L-1161"><span class="linenos">1161</span></a> <span class="n">newcontent</span> <span class="o">=</span> <span class="p">[</span><span class="kc">None</span> <span class="k">if</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">content</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">)</span> <span class="k">else</span> <span class="n">rmat</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">T</span><span class="p">)]</span>
</span><span id="L-1162"><a href="#L-1162"><span class="linenos">1162</span></a> <span class="k">return</span> <span class="n">Corr</span><span class="p">(</span><span class="n">newcontent</span><span class="p">)</span>
</span><span id="L-1163"><a href="#L-1163"><span class="linenos">1163</span></a>
</span><span id="L-1164"><a href="#L-1164"><span class="linenos">1164</span></a>
</span><span id="L-1165"><a href="#L-1165"><span class="linenos">1165</span></a><span class="k">def</span> <span class="nf">_sort_vectors</span><span class="p">(</span><span class="n">vec_set</span><span class="p">,</span> <span class="n">ts</span><span class="p">):</span>
</span><span id="L-1166"><a href="#L-1166"><span class="linenos">1166</span></a> <span class="sd">&quot;&quot;&quot;Helper function used to find a set of Eigenvectors consistent over all timeslices&quot;&quot;&quot;</span>
</span><span id="L-1167"><a href="#L-1167"><span class="linenos">1167</span></a> <span class="n">reference_sorting</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">vec_set</span><span class="p">[</span><span class="n">ts</span><span class="p">])</span>
</span><span id="L-1168"><a href="#L-1168"><span class="linenos">1168</span></a> <span class="n">N</span> <span class="o">=</span> <span class="n">reference_sorting</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span><span id="L-1169"><a href="#L-1169"><span class="linenos">1169</span></a> <span class="n">sorted_vec_set</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-1170"><a href="#L-1170"><span class="linenos">1170</span></a> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">vec_set</span><span class="p">)):</span>
</span><span id="L-1171"><a href="#L-1171"><span class="linenos">1171</span></a> <span class="k">if</span> <span class="n">vec_set</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-1172"><a href="#L-1172"><span class="linenos">1172</span></a> <span class="n">sorted_vec_set</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span>
</span><span id="L-1173"><a href="#L-1173"><span class="linenos">1173</span></a> <span class="k">elif</span> <span class="ow">not</span> <span class="n">t</span> <span class="o">==</span> <span class="n">ts</span><span class="p">:</span>
</span><span id="L-1174"><a href="#L-1174"><span class="linenos">1174</span></a> <span class="n">perms</span> <span class="o">=</span> <span class="p">[</span><span class="nb">list</span><span class="p">(</span><span class="n">o</span><span class="p">)</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">permutations</span><span class="p">([</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">N</span><span class="p">)],</span> <span class="n">N</span><span class="p">)]</span>
</span><span id="L-1175"><a href="#L-1175"><span class="linenos">1175</span></a> <span class="n">best_score</span> <span class="o">=</span> <span class="mi">0</span>
</span><span id="L-1176"><a href="#L-1176"><span class="linenos">1176</span></a> <span class="k">for</span> <span class="n">perm</span> <span class="ow">in</span> <span class="n">perms</span><span class="p">:</span>
</span><span id="L-1177"><a href="#L-1177"><span class="linenos">1177</span></a> <span class="n">current_score</span> <span class="o">=</span> <span class="mi">1</span>
</span><span id="L-1178"><a href="#L-1178"><span class="linenos">1178</span></a> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">N</span><span class="p">):</span>
</span><span id="L-1179"><a href="#L-1179"><span class="linenos">1179</span></a> <span class="n">new_sorting</span> <span class="o">=</span> <span class="n">reference_sorting</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
</span><span id="L-1180"><a href="#L-1180"><span class="linenos">1180</span></a> <span class="n">new_sorting</span><span class="p">[</span><span class="n">perm</span><span class="p">[</span><span class="n">k</span><span class="p">],</span> <span class="p">:]</span> <span class="o">=</span> <span class="n">vec_set</span><span class="p">[</span><span class="n">t</span><span class="p">][</span><span class="n">k</span><span class="p">]</span>
</span><span id="L-1181"><a href="#L-1181"><span class="linenos">1181</span></a> <span class="n">current_score</span> <span class="o">*=</span> <span class="nb">abs</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">det</span><span class="p">(</span><span class="n">new_sorting</span><span class="p">))</span>
</span><span id="L-1182"><a href="#L-1182"><span class="linenos">1182</span></a> <span class="k">if</span> <span class="n">current_score</span> <span class="o">&gt;</span> <span class="n">best_score</span><span class="p">:</span>
</span><span id="L-1183"><a href="#L-1183"><span class="linenos">1183</span></a> <span class="n">best_score</span> <span class="o">=</span> <span class="n">current_score</span>
</span><span id="L-1184"><a href="#L-1184"><span class="linenos">1184</span></a> <span class="n">best_perm</span> <span class="o">=</span> <span class="n">perm</span>
</span><span id="L-1185"><a href="#L-1185"><span class="linenos">1185</span></a> <span class="n">sorted_vec_set</span><span class="o">.</span><span class="n">append</span><span class="p">([</span><span class="n">vec_set</span><span class="p">[</span><span class="n">t</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">best_perm</span><span class="p">])</span>
</span><span id="L-1186"><a href="#L-1186"><span class="linenos">1186</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-1187"><a href="#L-1187"><span class="linenos">1187</span></a> <span class="n">sorted_vec_set</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">vec_set</span><span class="p">[</span><span class="n">t</span><span class="p">])</span>
</span><span id="L-1188"><a href="#L-1188"><span class="linenos">1188</span></a>
</span><span id="L-1189"><a href="#L-1189"><span class="linenos">1189</span></a> <span class="k">return</span> <span class="n">sorted_vec_set</span>
</span><span id="L-1190"><a href="#L-1190"><span class="linenos">1190</span></a>
</span><span id="L-1191"><a href="#L-1191"><span class="linenos">1191</span></a>
</span><span id="L-1192"><a href="#L-1192"><span class="linenos">1192</span></a><span class="k">def</span> <span class="nf">_GEVP_solver</span><span class="p">(</span><span class="n">Gt</span><span class="p">,</span> <span class="n">G0</span><span class="p">):</span> <span class="c1"># Just so normalization an sorting does not need to be repeated. Here we could later put in some checks</span>
</span><span id="L-1193"><a href="#L-1193"><span class="linenos">1193</span></a> <span class="n">sp_val</span><span class="p">,</span> <span class="n">sp_vecs</span> <span class="o">=</span> <span class="n">scipy</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">eigh</span><span class="p">(</span><span class="n">Gt</span><span class="p">,</span> <span class="n">G0</span><span class="p">)</span>
</span><span id="L-1194"><a href="#L-1194"><span class="linenos">1194</span></a> <span class="n">sp_vecs</span> <span class="o">=</span> <span class="p">[</span><span class="n">sp_vecs</span><span class="p">[:,</span> <span class="n">np</span><span class="o">.</span><span class="n">argsort</span><span class="p">(</span><span class="n">sp_val</span><span class="p">)[</span><span class="o">-</span><span class="n">i</span><span class="p">]]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">sp_vecs</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)]</span>
</span><span id="L-1195"><a href="#L-1195"><span class="linenos">1195</span></a> <span class="n">sp_vecs</span> <span class="o">=</span> <span class="p">[</span><span class="n">v</span> <span class="o">/</span> <span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">((</span><span class="n">v</span><span class="o">.</span><span class="n">T</span> <span class="o">@</span> <span class="n">G0</span> <span class="o">@</span> <span class="n">v</span><span class="p">))</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">sp_vecs</span><span class="p">]</span>
</span><span id="L-1196"><a href="#L-1196"><span class="linenos">1196</span></a> <span class="k">return</span> <span class="n">sp_vecs</span>
</span></pre></div>
</details>
@ -2453,6 +2515,65 @@
</span><span id="Corr-1102"><a href="#Corr-1102"><span class="linenos">1102</span></a> <span class="k">return</span> <span class="n">obs_OR_cobs</span> <span class="o">*</span> <span class="mi">0</span> <span class="c1"># So it stays the right type</span>
</span><span id="Corr-1103"><a href="#Corr-1103"><span class="linenos">1103</span></a>
</span><span id="Corr-1104"><a href="#Corr-1104"><span class="linenos">1104</span></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_apply_func_to_corr</span><span class="p">(</span><span class="n">return_imag</span><span class="p">)</span>
</span><span id="Corr-1105"><a href="#Corr-1105"><span class="linenos">1105</span></a>
</span><span id="Corr-1106"><a href="#Corr-1106"><span class="linenos">1106</span></a> <span class="k">def</span> <span class="nf">prune</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">Ntrunc</span><span class="p">,</span> <span class="n">tproj</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">t0proj</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">basematrix</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
</span><span id="Corr-1107"><a href="#Corr-1107"><span class="linenos">1107</span></a> <span class="sa">r</span><span class="sd">&#39;&#39;&#39; Project large correlation matrix to lowest states</span>
</span><span id="Corr-1108"><a href="#Corr-1108"><span class="linenos">1108</span></a>
</span><span id="Corr-1109"><a href="#Corr-1109"><span class="linenos">1109</span></a><span class="sd"> This method can be used to reduce the size of an (N x N) correlation matrix</span>
</span><span id="Corr-1110"><a href="#Corr-1110"><span class="linenos">1110</span></a><span class="sd"> to (Ntrunc x Ntrunc) by solving a GEVP at very early times where the noise</span>
</span><span id="Corr-1111"><a href="#Corr-1111"><span class="linenos">1111</span></a><span class="sd"> is still small.</span>
</span><span id="Corr-1112"><a href="#Corr-1112"><span class="linenos">1112</span></a>
</span><span id="Corr-1113"><a href="#Corr-1113"><span class="linenos">1113</span></a><span class="sd"> Parameters</span>
</span><span id="Corr-1114"><a href="#Corr-1114"><span class="linenos">1114</span></a><span class="sd"> ----------</span>
</span><span id="Corr-1115"><a href="#Corr-1115"><span class="linenos">1115</span></a><span class="sd"> Ntrunc: int</span>
</span><span id="Corr-1116"><a href="#Corr-1116"><span class="linenos">1116</span></a><span class="sd"> Rank of the target matrix.</span>
</span><span id="Corr-1117"><a href="#Corr-1117"><span class="linenos">1117</span></a><span class="sd"> tproj: int</span>
</span><span id="Corr-1118"><a href="#Corr-1118"><span class="linenos">1118</span></a><span class="sd"> Time where the eigenvectors are evaluated, corresponds to ts in the GEVP method.</span>
</span><span id="Corr-1119"><a href="#Corr-1119"><span class="linenos">1119</span></a><span class="sd"> The default value is 3.</span>
</span><span id="Corr-1120"><a href="#Corr-1120"><span class="linenos">1120</span></a><span class="sd"> t0proj: int</span>
</span><span id="Corr-1121"><a href="#Corr-1121"><span class="linenos">1121</span></a><span class="sd"> Time where the correlation matrix is inverted. Choosing t0proj=1 is strongly</span>
</span><span id="Corr-1122"><a href="#Corr-1122"><span class="linenos">1122</span></a><span class="sd"> discouraged for O(a) improved theories, since the correctness of the procedure</span>
</span><span id="Corr-1123"><a href="#Corr-1123"><span class="linenos">1123</span></a><span class="sd"> cannot be granted in this case. The default value is 2.</span>
</span><span id="Corr-1124"><a href="#Corr-1124"><span class="linenos">1124</span></a><span class="sd"> basematrix : Corr</span>
</span><span id="Corr-1125"><a href="#Corr-1125"><span class="linenos">1125</span></a><span class="sd"> Correlation matrix that is used to determine the eigenvectors of the</span>
</span><span id="Corr-1126"><a href="#Corr-1126"><span class="linenos">1126</span></a><span class="sd"> lowest states based on a GEVP. basematrix is taken to be the Corr itself if</span>
</span><span id="Corr-1127"><a href="#Corr-1127"><span class="linenos">1127</span></a><span class="sd"> is is not specified.</span>
</span><span id="Corr-1128"><a href="#Corr-1128"><span class="linenos">1128</span></a>
</span><span id="Corr-1129"><a href="#Corr-1129"><span class="linenos">1129</span></a><span class="sd"> Notes</span>
</span><span id="Corr-1130"><a href="#Corr-1130"><span class="linenos">1130</span></a><span class="sd"> -----</span>
</span><span id="Corr-1131"><a href="#Corr-1131"><span class="linenos">1131</span></a><span class="sd"> We have the basematrix $C(t)$ and the target matrix $G(t)$. We start by solving</span>
</span><span id="Corr-1132"><a href="#Corr-1132"><span class="linenos">1132</span></a><span class="sd"> the GEVP $$C(t) v_n(t, t_0) = \lambda_n(t, t_0) C(t_0) v_n(t, t_0)$$ where $t \equiv t_\mathrm{proj}$</span>
</span><span id="Corr-1133"><a href="#Corr-1133"><span class="linenos">1133</span></a><span class="sd"> and $t_0 \equiv t_{0, \mathrm{proj}}$. The target matrix is projected onto the subspace of the</span>
</span><span id="Corr-1134"><a href="#Corr-1134"><span class="linenos">1134</span></a><span class="sd"> resulting eigenvectors $v_n, n=1,\dots,N_\mathrm{trunc}$ via</span>
</span><span id="Corr-1135"><a href="#Corr-1135"><span class="linenos">1135</span></a><span class="sd"> $$G^\prime_{i, j}(t) = (v_i, G(t) v_j)$$. This allows to reduce the size of a large</span>
</span><span id="Corr-1136"><a href="#Corr-1136"><span class="linenos">1136</span></a><span class="sd"> correlation matrix and to remove some noise that is added by irrelevant operators.</span>
</span><span id="Corr-1137"><a href="#Corr-1137"><span class="linenos">1137</span></a><span class="sd"> This may allow to use the GEVP on $G(t)$ at late times such that the theoretically motivated</span>
</span><span id="Corr-1138"><a href="#Corr-1138"><span class="linenos">1138</span></a><span class="sd"> bound $t_0 \leq t/2$ holds, since the condition number of $G(t)$ is decreased, compared to $C(t)$.</span>
</span><span id="Corr-1139"><a href="#Corr-1139"><span class="linenos">1139</span></a><span class="sd"> &#39;&#39;&#39;</span>
</span><span id="Corr-1140"><a href="#Corr-1140"><span class="linenos">1140</span></a>
</span><span id="Corr-1141"><a href="#Corr-1141"><span class="linenos">1141</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">N</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="Corr-1142"><a href="#Corr-1142"><span class="linenos">1142</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">&#39;Method cannot be applied to one-dimensional correlators.&#39;</span><span class="p">)</span>
</span><span id="Corr-1143"><a href="#Corr-1143"><span class="linenos">1143</span></a> <span class="k">if</span> <span class="n">basematrix</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Corr-1144"><a href="#Corr-1144"><span class="linenos">1144</span></a> <span class="n">basematrix</span> <span class="o">=</span> <span class="bp">self</span>
</span><span id="Corr-1145"><a href="#Corr-1145"><span class="linenos">1145</span></a> <span class="k">if</span> <span class="n">Ntrunc</span> <span class="o">&gt;=</span> <span class="n">basematrix</span><span class="o">.</span><span class="n">N</span><span class="p">:</span>
</span><span id="Corr-1146"><a href="#Corr-1146"><span class="linenos">1146</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">&#39;Cannot truncate using Ntrunc &lt;= </span><span class="si">%d</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">basematrix</span><span class="o">.</span><span class="n">N</span><span class="p">))</span>
</span><span id="Corr-1147"><a href="#Corr-1147"><span class="linenos">1147</span></a> <span class="k">if</span> <span class="n">basematrix</span><span class="o">.</span><span class="n">N</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">N</span><span class="p">:</span>
</span><span id="Corr-1148"><a href="#Corr-1148"><span class="linenos">1148</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">&#39;basematrix and targetmatrix have to be of the same size.&#39;</span><span class="p">)</span>
</span><span id="Corr-1149"><a href="#Corr-1149"><span class="linenos">1149</span></a>
</span><span id="Corr-1150"><a href="#Corr-1150"><span class="linenos">1150</span></a> <span class="n">evecs</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="Corr-1151"><a href="#Corr-1151"><span class="linenos">1151</span></a> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">Ntrunc</span><span class="p">):</span>
</span><span id="Corr-1152"><a href="#Corr-1152"><span class="linenos">1152</span></a> <span class="n">evecs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">basematrix</span><span class="o">.</span><span class="n">GEVP</span><span class="p">(</span><span class="n">t0proj</span><span class="p">,</span> <span class="n">tproj</span><span class="p">,</span> <span class="n">state</span><span class="o">=</span><span class="n">i</span><span class="p">))</span>
</span><span id="Corr-1153"><a href="#Corr-1153"><span class="linenos">1153</span></a>
</span><span id="Corr-1154"><a href="#Corr-1154"><span class="linenos">1154</span></a> <span class="n">tmpmat</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">((</span><span class="n">Ntrunc</span><span class="p">,</span> <span class="n">Ntrunc</span><span class="p">),</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">object</span><span class="p">)</span>
</span><span id="Corr-1155"><a href="#Corr-1155"><span class="linenos">1155</span></a> <span class="n">rmat</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="Corr-1156"><a href="#Corr-1156"><span class="linenos">1156</span></a> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">basematrix</span><span class="o">.</span><span class="n">T</span><span class="p">):</span>
</span><span id="Corr-1157"><a href="#Corr-1157"><span class="linenos">1157</span></a> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">Ntrunc</span><span class="p">):</span>
</span><span id="Corr-1158"><a href="#Corr-1158"><span class="linenos">1158</span></a> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">Ntrunc</span><span class="p">):</span>
</span><span id="Corr-1159"><a href="#Corr-1159"><span class="linenos">1159</span></a> <span class="n">tmpmat</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">evecs</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">T</span> <span class="o">@</span> <span class="bp">self</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="o">@</span> <span class="n">evecs</span><span class="p">[</span><span class="n">j</span><span class="p">]</span>
</span><span id="Corr-1160"><a href="#Corr-1160"><span class="linenos">1160</span></a> <span class="n">rmat</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">tmpmat</span><span class="p">))</span>
</span><span id="Corr-1161"><a href="#Corr-1161"><span class="linenos">1161</span></a>
</span><span id="Corr-1162"><a href="#Corr-1162"><span class="linenos">1162</span></a> <span class="n">newcontent</span> <span class="o">=</span> <span class="p">[</span><span class="kc">None</span> <span class="k">if</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">content</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">)</span> <span class="k">else</span> <span class="n">rmat</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">T</span><span class="p">)]</span>
</span><span id="Corr-1163"><a href="#Corr-1163"><span class="linenos">1163</span></a> <span class="k">return</span> <span class="n">Corr</span><span class="p">(</span><span class="n">newcontent</span><span class="p">)</span>
</span></pre></div>
</details>
@ -4311,6 +4432,116 @@ specifies a custom path for the file (default '.')</li>
</div>
<div id="Corr.prune" class="classattr">
<div class="attr function"><a class="headerlink" href="#Corr.prune">#&nbsp;&nbsp</a>
<span class="def">def</span>
<span class="name">prune</span><span class="signature">(self, Ntrunc, tproj=3, t0proj=2, basematrix=None)</span>:
</div>
<details>
<summary>View Source</summary>
<div class="pdoc-code codehilite"><pre><span></span><span id="Corr.prune-1106"><a href="#Corr.prune-1106"><span class="linenos">1106</span></a> <span class="k">def</span> <span class="nf">prune</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">Ntrunc</span><span class="p">,</span> <span class="n">tproj</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">t0proj</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">basematrix</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
</span><span id="Corr.prune-1107"><a href="#Corr.prune-1107"><span class="linenos">1107</span></a> <span class="sa">r</span><span class="sd">&#39;&#39;&#39; Project large correlation matrix to lowest states</span>
</span><span id="Corr.prune-1108"><a href="#Corr.prune-1108"><span class="linenos">1108</span></a>
</span><span id="Corr.prune-1109"><a href="#Corr.prune-1109"><span class="linenos">1109</span></a><span class="sd"> This method can be used to reduce the size of an (N x N) correlation matrix</span>
</span><span id="Corr.prune-1110"><a href="#Corr.prune-1110"><span class="linenos">1110</span></a><span class="sd"> to (Ntrunc x Ntrunc) by solving a GEVP at very early times where the noise</span>
</span><span id="Corr.prune-1111"><a href="#Corr.prune-1111"><span class="linenos">1111</span></a><span class="sd"> is still small.</span>
</span><span id="Corr.prune-1112"><a href="#Corr.prune-1112"><span class="linenos">1112</span></a>
</span><span id="Corr.prune-1113"><a href="#Corr.prune-1113"><span class="linenos">1113</span></a><span class="sd"> Parameters</span>
</span><span id="Corr.prune-1114"><a href="#Corr.prune-1114"><span class="linenos">1114</span></a><span class="sd"> ----------</span>
</span><span id="Corr.prune-1115"><a href="#Corr.prune-1115"><span class="linenos">1115</span></a><span class="sd"> Ntrunc: int</span>
</span><span id="Corr.prune-1116"><a href="#Corr.prune-1116"><span class="linenos">1116</span></a><span class="sd"> Rank of the target matrix.</span>
</span><span id="Corr.prune-1117"><a href="#Corr.prune-1117"><span class="linenos">1117</span></a><span class="sd"> tproj: int</span>
</span><span id="Corr.prune-1118"><a href="#Corr.prune-1118"><span class="linenos">1118</span></a><span class="sd"> Time where the eigenvectors are evaluated, corresponds to ts in the GEVP method.</span>
</span><span id="Corr.prune-1119"><a href="#Corr.prune-1119"><span class="linenos">1119</span></a><span class="sd"> The default value is 3.</span>
</span><span id="Corr.prune-1120"><a href="#Corr.prune-1120"><span class="linenos">1120</span></a><span class="sd"> t0proj: int</span>
</span><span id="Corr.prune-1121"><a href="#Corr.prune-1121"><span class="linenos">1121</span></a><span class="sd"> Time where the correlation matrix is inverted. Choosing t0proj=1 is strongly</span>
</span><span id="Corr.prune-1122"><a href="#Corr.prune-1122"><span class="linenos">1122</span></a><span class="sd"> discouraged for O(a) improved theories, since the correctness of the procedure</span>
</span><span id="Corr.prune-1123"><a href="#Corr.prune-1123"><span class="linenos">1123</span></a><span class="sd"> cannot be granted in this case. The default value is 2.</span>
</span><span id="Corr.prune-1124"><a href="#Corr.prune-1124"><span class="linenos">1124</span></a><span class="sd"> basematrix : Corr</span>
</span><span id="Corr.prune-1125"><a href="#Corr.prune-1125"><span class="linenos">1125</span></a><span class="sd"> Correlation matrix that is used to determine the eigenvectors of the</span>
</span><span id="Corr.prune-1126"><a href="#Corr.prune-1126"><span class="linenos">1126</span></a><span class="sd"> lowest states based on a GEVP. basematrix is taken to be the Corr itself if</span>
</span><span id="Corr.prune-1127"><a href="#Corr.prune-1127"><span class="linenos">1127</span></a><span class="sd"> is is not specified.</span>
</span><span id="Corr.prune-1128"><a href="#Corr.prune-1128"><span class="linenos">1128</span></a>
</span><span id="Corr.prune-1129"><a href="#Corr.prune-1129"><span class="linenos">1129</span></a><span class="sd"> Notes</span>
</span><span id="Corr.prune-1130"><a href="#Corr.prune-1130"><span class="linenos">1130</span></a><span class="sd"> -----</span>
</span><span id="Corr.prune-1131"><a href="#Corr.prune-1131"><span class="linenos">1131</span></a><span class="sd"> We have the basematrix $C(t)$ and the target matrix $G(t)$. We start by solving</span>
</span><span id="Corr.prune-1132"><a href="#Corr.prune-1132"><span class="linenos">1132</span></a><span class="sd"> the GEVP $$C(t) v_n(t, t_0) = \lambda_n(t, t_0) C(t_0) v_n(t, t_0)$$ where $t \equiv t_\mathrm{proj}$</span>
</span><span id="Corr.prune-1133"><a href="#Corr.prune-1133"><span class="linenos">1133</span></a><span class="sd"> and $t_0 \equiv t_{0, \mathrm{proj}}$. The target matrix is projected onto the subspace of the</span>
</span><span id="Corr.prune-1134"><a href="#Corr.prune-1134"><span class="linenos">1134</span></a><span class="sd"> resulting eigenvectors $v_n, n=1,\dots,N_\mathrm{trunc}$ via</span>
</span><span id="Corr.prune-1135"><a href="#Corr.prune-1135"><span class="linenos">1135</span></a><span class="sd"> $$G^\prime_{i, j}(t) = (v_i, G(t) v_j)$$. This allows to reduce the size of a large</span>
</span><span id="Corr.prune-1136"><a href="#Corr.prune-1136"><span class="linenos">1136</span></a><span class="sd"> correlation matrix and to remove some noise that is added by irrelevant operators.</span>
</span><span id="Corr.prune-1137"><a href="#Corr.prune-1137"><span class="linenos">1137</span></a><span class="sd"> This may allow to use the GEVP on $G(t)$ at late times such that the theoretically motivated</span>
</span><span id="Corr.prune-1138"><a href="#Corr.prune-1138"><span class="linenos">1138</span></a><span class="sd"> bound $t_0 \leq t/2$ holds, since the condition number of $G(t)$ is decreased, compared to $C(t)$.</span>
</span><span id="Corr.prune-1139"><a href="#Corr.prune-1139"><span class="linenos">1139</span></a><span class="sd"> &#39;&#39;&#39;</span>
</span><span id="Corr.prune-1140"><a href="#Corr.prune-1140"><span class="linenos">1140</span></a>
</span><span id="Corr.prune-1141"><a href="#Corr.prune-1141"><span class="linenos">1141</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">N</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="Corr.prune-1142"><a href="#Corr.prune-1142"><span class="linenos">1142</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">&#39;Method cannot be applied to one-dimensional correlators.&#39;</span><span class="p">)</span>
</span><span id="Corr.prune-1143"><a href="#Corr.prune-1143"><span class="linenos">1143</span></a> <span class="k">if</span> <span class="n">basematrix</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="Corr.prune-1144"><a href="#Corr.prune-1144"><span class="linenos">1144</span></a> <span class="n">basematrix</span> <span class="o">=</span> <span class="bp">self</span>
</span><span id="Corr.prune-1145"><a href="#Corr.prune-1145"><span class="linenos">1145</span></a> <span class="k">if</span> <span class="n">Ntrunc</span> <span class="o">&gt;=</span> <span class="n">basematrix</span><span class="o">.</span><span class="n">N</span><span class="p">:</span>
</span><span id="Corr.prune-1146"><a href="#Corr.prune-1146"><span class="linenos">1146</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">&#39;Cannot truncate using Ntrunc &lt;= </span><span class="si">%d</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">basematrix</span><span class="o">.</span><span class="n">N</span><span class="p">))</span>
</span><span id="Corr.prune-1147"><a href="#Corr.prune-1147"><span class="linenos">1147</span></a> <span class="k">if</span> <span class="n">basematrix</span><span class="o">.</span><span class="n">N</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">N</span><span class="p">:</span>
</span><span id="Corr.prune-1148"><a href="#Corr.prune-1148"><span class="linenos">1148</span></a> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">&#39;basematrix and targetmatrix have to be of the same size.&#39;</span><span class="p">)</span>
</span><span id="Corr.prune-1149"><a href="#Corr.prune-1149"><span class="linenos">1149</span></a>
</span><span id="Corr.prune-1150"><a href="#Corr.prune-1150"><span class="linenos">1150</span></a> <span class="n">evecs</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="Corr.prune-1151"><a href="#Corr.prune-1151"><span class="linenos">1151</span></a> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">Ntrunc</span><span class="p">):</span>
</span><span id="Corr.prune-1152"><a href="#Corr.prune-1152"><span class="linenos">1152</span></a> <span class="n">evecs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">basematrix</span><span class="o">.</span><span class="n">GEVP</span><span class="p">(</span><span class="n">t0proj</span><span class="p">,</span> <span class="n">tproj</span><span class="p">,</span> <span class="n">state</span><span class="o">=</span><span class="n">i</span><span class="p">))</span>
</span><span id="Corr.prune-1153"><a href="#Corr.prune-1153"><span class="linenos">1153</span></a>
</span><span id="Corr.prune-1154"><a href="#Corr.prune-1154"><span class="linenos">1154</span></a> <span class="n">tmpmat</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">empty</span><span class="p">((</span><span class="n">Ntrunc</span><span class="p">,</span> <span class="n">Ntrunc</span><span class="p">),</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">object</span><span class="p">)</span>
</span><span id="Corr.prune-1155"><a href="#Corr.prune-1155"><span class="linenos">1155</span></a> <span class="n">rmat</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="Corr.prune-1156"><a href="#Corr.prune-1156"><span class="linenos">1156</span></a> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">basematrix</span><span class="o">.</span><span class="n">T</span><span class="p">):</span>
</span><span id="Corr.prune-1157"><a href="#Corr.prune-1157"><span class="linenos">1157</span></a> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">Ntrunc</span><span class="p">):</span>
</span><span id="Corr.prune-1158"><a href="#Corr.prune-1158"><span class="linenos">1158</span></a> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">Ntrunc</span><span class="p">):</span>
</span><span id="Corr.prune-1159"><a href="#Corr.prune-1159"><span class="linenos">1159</span></a> <span class="n">tmpmat</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">evecs</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">T</span> <span class="o">@</span> <span class="bp">self</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="o">@</span> <span class="n">evecs</span><span class="p">[</span><span class="n">j</span><span class="p">]</span>
</span><span id="Corr.prune-1160"><a href="#Corr.prune-1160"><span class="linenos">1160</span></a> <span class="n">rmat</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">tmpmat</span><span class="p">))</span>
</span><span id="Corr.prune-1161"><a href="#Corr.prune-1161"><span class="linenos">1161</span></a>
</span><span id="Corr.prune-1162"><a href="#Corr.prune-1162"><span class="linenos">1162</span></a> <span class="n">newcontent</span> <span class="o">=</span> <span class="p">[</span><span class="kc">None</span> <span class="k">if</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">content</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">)</span> <span class="k">else</span> <span class="n">rmat</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">T</span><span class="p">)]</span>
</span><span id="Corr.prune-1163"><a href="#Corr.prune-1163"><span class="linenos">1163</span></a> <span class="k">return</span> <span class="n">Corr</span><span class="p">(</span><span class="n">newcontent</span><span class="p">)</span>
</span></pre></div>
</details>
<div class="docstring"><p>Project large correlation matrix to lowest states</p>
<p>This method can be used to reduce the size of an (N x N) correlation matrix
to (Ntrunc x Ntrunc) by solving a GEVP at very early times where the noise
is still small.</p>
<h6 id="parameters">Parameters</h6>
<ul>
<li><strong>Ntrunc</strong> (int):
Rank of the target matrix.</li>
<li><strong>tproj</strong> (int):
Time where the eigenvectors are evaluated, corresponds to ts in the GEVP method.
The default value is 3.</li>
<li><strong>t0proj</strong> (int):
Time where the correlation matrix is inverted. Choosing t0proj=1 is strongly
discouraged for O(a) improved theories, since the correctness of the procedure
cannot be granted in this case. The default value is 2.</li>
<li><strong>basematrix</strong> (Corr):
Correlation matrix that is used to determine the eigenvectors of the
lowest states based on a GEVP. basematrix is taken to be the Corr itself if
is is not specified.</li>
</ul>
<h6 id="notes">Notes</h6>
<p>We have the basematrix $C(t)$ and the target matrix $G(t)$. We start by solving
the GEVP $$C(t) v_n(t, t_0) = \lambda_n(t, t_0) C(t_0) v_n(t, t_0)$$ where $t \equiv t_\mathrm{proj}$
and $t_0 \equiv t_{0, \mathrm{proj}}$. The target matrix is projected onto the subspace of the
resulting eigenvectors $v_n, n=1,\dots,N_\mathrm{trunc}$ via
$$G^\prime_{i, j}(t) = (v_i, G(t) v_j)$$. This allows to reduce the size of a large
correlation matrix and to remove some noise that is added by irrelevant operators.
This may allow to use the GEVP on $G(t)$ at late times such that the theoretically motivated
bound $t_0 \leq t/2$ holds, since the condition number of $G(t)$ is decreased, compared to $C(t)$.</p>
</div>
</div>
</section>
</main>

File diff suppressed because one or more lines are too long