62 auto G2_blocks_to_measure = params.measure_G2_blocks;
65 if (G2_blocks_to_measure.empty()) {
66 for (auto const &bn1 : gf_struct) {
67 for (auto const &bn2 : gf_struct) { G2_blocks_to_measure.emplace(bn1.first, bn2.first); }
70 for (
auto const &bn : G2_blocks_to_measure) {
71 auto count_bl = [&gf_struct](
auto bl_name){
return std::count_if(gf_struct.cbegin(), gf_struct.cend(), [&bl_name](
auto & bl){ return bl.first == bl_name; }); };
72 if (count_bl(bn.first) != 1) TRIQS_RUNTIME_ERROR <<
"Invalid left block name " << bn.first <<
" for G^2 measurement";
73 if (count_bl(bn.second) != 1) TRIQS_RUNTIME_ERROR <<
"Invalid right block name " << bn.second <<
" for G^2 measurement";
77 std::map<std::string, int> block_name_to_index;
78 auto block_names = _Delta_tau.block_names();
79 for (
auto block_idx : range(block_names.size())) {
80 std::string block_name = block_names[block_idx];
81 block_name_to_index[block_name] = block_idx;
84 for (
auto const &block_pair : G2_blocks_to_measure) {
86 auto const &bn1 = std::get<0>(block_pair);
87 auto const &bn2 = std::get<1>(block_pair);
89 auto b1 = block_name_to_index[bn1];
90 auto b2 = block_name_to_index[bn2];
92 int s1 = _Delta_tau[b1].target_shape()[0];
93 int s3 = _Delta_tau[b2].target_shape()[0];
94 int s2 = params.measure_G2_block_order == block_order::AABB ? s1 : s3;
95 int s4 = params.measure_G2_block_order == block_order::AABB ? s3 : s1;
97 std::array<int, 4> target_shape{s1, s2, s3, s4};
99 G2_measure_t measure{{b1, bn1}, {b2, bn2}, target_shape};
101 measures.push_back(measure);