131 auto size = tmp_state.size();
136 state_t final_state = H(tmp_state);
140 if (is_zero(amplitude))
return;
141 auto i_subspace = subspaces.find_set(i);
142 auto f_subspace = subspaces.find_set(f);
143 if (i_subspace != f_subspace) subspaces.link(i_subspace, f_subspace);
145 if (store_matrix_elements) matrix_elements[std::make_pair(i, f)] = amplitude;
149 foreach (final_state, mapping);
152 if (not delta.is_empty()) {
153 final_state = delta(tmp_state);
154 foreach (final_state, mapping);
198 std::multimap<idx_t, idx_t> Cd_connections, C_connections;
200 auto size = tmp_state.size();
205 auto i_subspace = subspaces.find_set(i);
207 auto fill_conn = [
this, i, i_subspace, store_matrix_elements](
operator_t const &op, std::multimap<idx_t, idx_t> &conn,
209 state_t final_state = op(tmp_state);
213 if (is_zero(amplitude))
return;
214 auto f_subspace = subspaces.find_set(f);
215 conn.insert({i_subspace, f_subspace});
216 if (store_matrix_elements) elem[{i, f}] = amplitude;
220 fill_conn(cd, Cd_connections, Cd_elements);
221 fill_conn(c, C_connections, C_elements);
227 while (!Cd_connections.empty()) {
231 auto const [lower_subspace, upper_subspace] = *std::begin(Cd_connections);
238 std::function<void(
idx_t,
bool)> zigzag_traversal = [
this, lower_subspace, upper_subspace, &Cd_connections, &C_connections,
239 &zigzag_traversal](
idx_t i_subspace,
242 std::multimap<idx_t, idx_t>::iterator it;
243 while ((it = (upwards ? Cd_connections : C_connections).find(i_subspace)) != (upwards ? Cd_connections : C_connections).
end()) {
245 auto f_subspace = it->second;
246 (upwards ? Cd_connections : C_connections).erase(it);
249 subspaces.link(f_subspace, upper_subspace);
251 subspaces.link(f_subspace, lower_subspace);
254 zigzag_traversal(f_subspace, !upwards);
259 zigzag_traversal(lower_subspace,
true);
264 return std::make_pair(Cd_elements, C_elements);
326 for (
idx_t i = 0; i < tmp_state.size(); ++i) {
327 state_t initial_state = tmp_state;
329 auto i_subspace = subspaces.find_set(i);
331 state_t final_state = op(initial_state);
336 if (is_zero(amplitude))
return;
337 auto f_subspace = subspaces.find_set(f);
338 if ((!diagonal_only) || i_subspace == f_subspace)
339 mapping.insert(std::make_pair(representative_to_index[i_subspace], representative_to_index[f_subspace]));