| 149 | } |
| 150 | |
| 151 | void build_ritz_vectors( |
| 152 | const std::vector<std::vector<Complex>>& basis, |
| 153 | const std::vector<std::vector<Complex>>& h_basis, |
| 154 | const std::vector<Complex>& coeff_col_major, |
| 155 | int m, |
| 156 | int n_roots, |
| 157 | std::vector<std::vector<Complex>>* ritz_vectors, |
| 158 | std::vector<std::vector<Complex>>* h_ritz_vectors |
| 159 | ) { |
| 160 | if (!ritz_vectors || !h_ritz_vectors) { |
| 161 | throw std::invalid_argument("build_ritz_vectors: null output pointer"); |
| 162 | } |
| 163 | const std::size_t n = basis.empty() ? 0 : basis[0].size(); |
| 164 | ritz_vectors->assign(static_cast<std::size_t>(n_roots), std::vector<Complex>(n, Complex{0.0, 0.0})); |
| 165 | h_ritz_vectors->assign(static_cast<std::size_t>(n_roots), std::vector<Complex>(n, Complex{0.0, 0.0})); |
| 166 | for (int root = 0; root < n_roots; ++root) { |
| 167 | auto& x = (*ritz_vectors)[static_cast<std::size_t>(root)]; |
| 168 | auto& hx = (*h_ritz_vectors)[static_cast<std::size_t>(root)]; |
| 169 | for (int p = 0; p < m; ++p) { |
| 170 | const Complex c = coeff_col_major[static_cast<std::size_t>(p + m * root)]; |
| 171 | const auto& vp = basis[static_cast<std::size_t>(p)]; |
| 172 | const auto& hvp = h_basis[static_cast<std::size_t>(p)]; |
| 173 | for (std::size_t i = 0; i < n; ++i) { |
| 174 | x[i] += c * vp[i]; |
| 175 | hx[i] += c * hvp[i]; |
| 176 | } |
| 177 | } |
| 178 | } |
| 179 | } |
| 180 | |
| 181 | EigensystemResult pack_eigensystem_from_columns( |
| 182 | int n, |
no test coverage detected