22#include "./double_insert.hpp"
24namespace triqs_cthyb {
26 histogram *move_insert_c_c_cdag_cdag::add_histo(std::string
const &name, histo_map_t *histos) {
27 if (!histos)
return nullptr;
28 auto new_histo = histos->insert({name, {.0, config.beta(), 100}});
29 return &(new_histo.first->second);
32 move_insert_c_c_cdag_cdag::move_insert_c_c_cdag_cdag(
int block_index1,
int block_index2,
int block_size1,
int block_size2,
33 std::string
const &block_name1, std::string
const &block_name2, qmc_data &data,
34 mc_tools::random_generator &rng, histo_map_t *histos)
38 block_index1(block_index1),
39 block_index2(block_index2),
40 block_size1(block_size1),
41 block_size2(block_size2),
42 histo_proposed1(add_histo(
"double_insert_length_proposed_" + block_name1, histos)),
43 histo_proposed2(add_histo(
"double_insert_length_proposed_" + block_name2, histos)),
44 histo_accepted1(add_histo(
"double_insert_length_accepted_" + block_name1, histos)),
45 histo_accepted2(add_histo(
"double_insert_length_accepted_" + block_name2, histos)) {}
47 mc_weight_t move_insert_c_c_cdag_cdag::attempt() {
50 std::cerr <<
">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" << std::endl;
51 std::cerr <<
"In config " << config.get_id() << std::endl;
52 std::cerr <<
"* Attempt for move_insert_c_c_cdag_cdag (blocks " << block_index1 <<
", " << block_index2 <<
")" << std::endl;
56 auto rs1 = rng(block_size1), rs2 = rng(block_size1), rs3 = rng(block_size2), rs4 = rng(block_size2);
57 op1 = op_desc{block_index1, rs1,
true, data.linindex[std::make_pair(block_index1, rs1)]};
58 op2 = op_desc{block_index1, rs2,
false, data.linindex[std::make_pair(block_index1, rs2)]};
59 op3 = op_desc{block_index2, rs3,
true, data.linindex[std::make_pair(block_index2, rs3)]};
60 op4 = op_desc{block_index2, rs4,
false, data.linindex[std::make_pair(block_index2, rs4)]};
63 tau1 = data.tau_seg.get_random_pt(rng);
64 tau2 = data.tau_seg.get_random_pt(rng);
65 tau3 = data.tau_seg.get_random_pt(rng);
66 tau4 = data.tau_seg.get_random_pt(rng);
67 if ((tau1 == tau3) or (tau2 == tau4))
return 0;
70 std::cerr <<
"* Proposing to insert:" << std::endl;
71 std::cerr << op1 <<
" at " << tau1 << std::endl;
72 std::cerr << op2 <<
" at " << tau2 << std::endl;
73 std::cerr << op3 <<
" at " << tau3 << std::endl;
74 std::cerr << op4 <<
" at " << tau4 << std::endl;
78 dtau1 = double(tau2 - tau1);
79 dtau2 = double(tau4 - tau3);
80 if (histo_proposed1) {
81 *histo_proposed1 << dtau1;
82 *histo_proposed2 << dtau2;
90 data.imp_trace.try_insert(tau1, op1);
91 data.imp_trace.try_insert(tau2, op2);
92 data.imp_trace.try_insert(tau3, op3);
93 data.imp_trace.try_insert(tau4, op4);
94 }
catch (rbt_insert_error
const &) {
95 std::cerr <<
"Insert error : recovering ... " << std::endl;
96 data.imp_trace.cancel_insert();
101 auto &det1 = data.dets[block_index1];
102 auto &det2 = data.dets[block_index2];
103 int det1_size = det1.size();
104 int det2_size = det2.size();
105 det_scalar_t det_ratio;
109 int num_c_dag1, num_c1, num_c_dag2, num_c2;
110 for (num_c_dag1 = 0; num_c_dag1 < det1_size; ++num_c_dag1) {
111 if (det1.get_x(num_c_dag1).first < tau1)
break;
113 for (num_c1 = 0; num_c1 < det1_size; ++num_c1) {
114 if (det1.get_y(num_c1).first < tau2)
break;
116 for (num_c_dag2 = 0; num_c_dag2 < det2_size; ++num_c_dag2) {
117 if (det2.get_x(num_c_dag2).first < tau3)
break;
119 for (num_c2 = 0; num_c2 < det2_size; ++num_c2) {
120 if (det2.get_y(num_c2).first < tau4)
break;
124 if (block_index1 == block_index2) {
136 det_ratio = det1.try_insert2(num_c_dag1, num_c_dag2, num_c1, num_c2, {tau1, op1.inner_index}, {tau3, op3.inner_index}, {tau2, op2.inner_index},
137 {tau4, op4.inner_index});
139 auto det_ratio1 = det1.try_insert(num_c_dag1, num_c1, {tau1, op1.inner_index}, {tau2, op2.inner_index});
140 auto det_ratio2 = det2.try_insert(num_c_dag2, num_c2, {tau3, op3.inner_index}, {tau4, op4.inner_index});
141 det_ratio = det_ratio1 * det_ratio2;
146 if (block_index1 == block_index2) {
150 t_ratio = std::pow(block_size1 * config.beta() /
double(det1.size() + 2), 4);
154 std::pow(block_size1 * config.beta() /
double(det1.size() + 1), 2) * std::pow(block_size2 * config.beta() /
double(det2.size() + 1), 2);
158 double random_number = rng.preview();
159 if (random_number == 0.0)
return 0;
160 double p_yee = std::abs(t_ratio * det_ratio / data.atomic_weight);
163 std::tie(new_atomic_weight, new_atomic_reweighting) = data.imp_trace.compute(p_yee, random_number);
164 if (new_atomic_weight == 0.0) {
166 std::cerr <<
"atomic_weight == 0" << std::endl;
170 auto atomic_weight_ratio = new_atomic_weight / data.atomic_weight;
171 if (!isfinite(atomic_weight_ratio))
172 TRIQS_RUNTIME_ERROR <<
"atomic_weight_ratio not finite " << new_atomic_weight <<
" " << data.atomic_weight <<
" "
173 << new_atomic_weight / data.atomic_weight <<
" in config " << config.get_id();
175 mc_weight_t p = atomic_weight_ratio * det_ratio;
178 std::cerr <<
"Trace ratio: " << atomic_weight_ratio <<
'\t';
179 std::cerr <<
"Det ratio: " << det_ratio <<
'\t';
180 std::cerr <<
"Prefactor: " << t_ratio <<
'\t';
181 std::cerr <<
"Weight: " << p * t_ratio << std::endl;
182 std::cerr <<
"p_yee * newtrace: " << p_yee * new_atomic_weight << std::endl;
185 if (!isfinite(p * t_ratio))
186 TRIQS_RUNTIME_ERROR <<
"p * t_ratio not finite p : " << p <<
" t_ratio : " << t_ratio <<
" in config " << config.get_id();
190 mc_weight_t move_insert_c_c_cdag_cdag::accept() {
193 data.imp_trace.confirm_insert();
196 config.insert(tau1, op1);
197 config.insert(tau2, op2);
198 config.insert(tau3, op3);
199 config.insert(tau4, op4);
203 if (block_index1 == block_index2) {
204 data.dets[block_index1].complete_operation();
206 data.dets[block_index1].complete_operation();
207 data.dets[block_index2].complete_operation();
211 data.atomic_weight = new_atomic_weight;
212 data.atomic_reweighting = new_atomic_reweighting;
214 if (histo_accepted1) {
215 *histo_accepted1 << dtau1;
216 *histo_accepted2 << dtau2;
220 std::cerr <<
"* Move move_insert_c_c_cdag_cdag accepted" << std::endl;
221 std::cerr <<
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" << std::endl;
222 check_det_sequence(data.dets[block_index1], config.get_id());
223 check_det_sequence(data.dets[block_index2], config.get_id());
226 return data.current_sign / data.old_sign;
231 void move_insert_c_c_cdag_cdag::reject() {
234 data.imp_trace.cancel_insert();
235 if (block_index1 == block_index2) {
236 data.dets[block_index1].reject_last_try();
238 data.dets[block_index1].reject_last_try();
239 data.dets[block_index2].reject_last_try();
243 std::cerr <<
"* Move move_insert_c_c_cdag_cdag rejected" << std::endl;
244 std::cerr <<
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" << std::endl;
245 check_det_sequence(data.dets[block_index1], config.get_id());
246 check_det_sequence(data.dets[block_index2], config.get_id());