33 std::vector<std::vector<idx_t>> c_vec_G0, cdag_vec_G0;
34 std::vector<std::vector<idx_t>> c_vec_M, cdag_vec_M;
37 auto const &G0_tau_mesh = G0_tau[0].mesh();
38 auto const &M_tau_mesh = tau_mesh;
41 for (
auto &det : qmc_config.dets) {
43 auto x_to_G0_mesh = [&G0_tau_mesh](c_t
const &c_i) {
return idx_t{G0_tau_mesh.to_index(closest_mesh_pt(
double(c_i.tau))), c_i.u, c_i.tau}; };
44 auto y_to_G0_mesh = [beta = params.beta, &G0_tau_mesh](cdag_t
const &cdag_j) {
45 return idx_t{G0_tau_mesh.to_index(closest_mesh_pt(beta -
double(cdag_j.tau))), cdag_j.u, cdag_j.tau};
48 auto x_to_M_mesh = [&M_tau_mesh](c_t
const &c_i) {
return idx_t{M_tau_mesh.to_index(closest_mesh_pt(
double(c_i.tau))), c_i.u, c_i.tau}; };
49 auto y_to_M_mesh = [&M_tau_mesh](cdag_t
const &cdag_j) {
50 return idx_t{M_tau_mesh.to_index(closest_mesh_pt(
double(cdag_j.tau))), cdag_j.u, cdag_j.tau};
54 c_vec_G0.push_back(make_vector_from_range(transform(det.get_x_internal_order(), x_to_G0_mesh)));
55 cdag_vec_G0.push_back(make_vector_from_range(transform(det.get_y_internal_order(), y_to_G0_mesh)));
56 c_vec_M.push_back(make_vector_from_range(transform(det.get_x_internal_order(), x_to_M_mesh)));
57 cdag_vec_M.push_back(make_vector_from_range(transform(det.get_y_internal_order(), y_to_M_mesh)));
61 std::vector<matrix<dcomplex>> M_vec(params.n_blocks());
62 std::vector<matrix<dcomplex>> GM_vec(params.n_blocks());
63 std::vector<matrix<dcomplex>> MG_vec(params.n_blocks());
64 std::vector<matrix<dcomplex>> GMG_vec(params.n_blocks());
67 for (
int bl : range(params.n_blocks())) {
69 auto const &det = qmc_config.dets[bl];
70 int det_size = det.size();
72 if (det.size() == 0)
continue;
74 auto const &c = c_vec_G0[bl];
75 auto const &cdag = cdag_vec_G0[bl];
76 int bl_size = G0_tau[bl].target_shape()[0];
77 auto G_left = matrix<dcomplex>(bl_size, det_size);
78 auto G_right = matrix<dcomplex>(det_size, bl_size);
80 for (
int u : range(bl_size))
81 for (
int i : range(det_size)) {
82 G_left(u, i) = -G0_tau[bl][cdag[i].tau_idx](u, cdag[i].u);
83 G_right(i, u) = G0_tau[bl][c[i].tau_idx](c[i].u, u);
85 M_vec[bl] = det.inverse_matrix_internal_order();
86 GM_vec[bl] = G_left * M_vec[bl];
87 MG_vec[bl] = M_vec[bl] * G_right;
88 GMG_vec[bl] = GM_vec[bl] * G_right;
92 for (
int bl1 : range(params.n_blocks())) {
94 int det1_size = qmc_config.dets[bl1].size();
97 if (det1_size == 0)
continue;
99 auto const &M = M_vec[bl1];
100 auto const &GM = GM_vec[bl1];
101 auto const &GMG = GMG_vec[bl1];
102 int bl1_size = G0_tau[bl1].target_shape()[0];
103 auto const &c1 = c_vec_M[bl1];
104 auto const &cdag1 = cdag_vec_M[bl1];
107 auto &M3xph_tau = M3xph_tau_(bl1, bl1);
108 auto &M3xph_delta = M3xph_delta_(bl1, bl1);
110 for (
auto [i, j, k, l] : product_range(det1_size, bl1_size, bl1_size, det1_size)) {
112 if (c1[i].tau_pt == cdag1[l].tau_pt) {
113 M3xph_delta[c_vec_G0[bl1][i].tau_idx](c1[i].u, j, k, cdag1[l].u) += -sign * M(l, i) * GMG(j, k);
116 M3xph_tau[c1[i].tau_idx, cdag1[l].tau_idx](c1[i].u, j, k, cdag1[l].u) += -sign * M(l, i) * GMG(j, k);
120 for (
int bl2 : range(params.n_blocks())) {
122 int det2_size = qmc_config.dets[bl2].size();
125 if (det2_size == 0)
continue;
127 auto const &MG = MG_vec[bl2];
128 int bl2_size = G0_tau[bl2].target_shape()[0];
129 auto const &cdag2 = cdag_vec_M[bl2];
130 auto &M3xph_tau_bl = M3xph_tau_(bl1, bl2);
131 auto &M3xph_delta_bl = M3xph_delta_(bl1, bl2);
134 for (
auto [i, j, k, l] : product_range(det1_size, bl1_size, bl2_size, det2_size)) {
136 if (c1[i].tau_pt == cdag2[l].tau_pt) {
137 M3xph_delta_bl[c_vec_G0[bl1][i].tau_idx](c1[i].u, j, k, cdag2[l].u) += sign * GM(j, i) * MG(l, k);
139 M3xph_tau_bl[c1[i].tau_idx, cdag2[l].tau_idx](c1[i].u, j, k, cdag2[l].u) += sign * GM(j, i) * MG(l, k);