22#include "./double_remove.hpp"
24namespace triqs_cthyb {
26 histogram *move_remove_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_remove_c_c_cdag_cdag::move_remove_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_remove_length_proposed_" + block_name1, histos)),
43 histo_proposed2(add_histo(
"double_remove_length_proposed_" + block_name2, histos)),
44 histo_accepted1(add_histo(
"double_remove_length_accepted_" + block_name1, histos)),
45 histo_accepted2(add_histo(
"double_remove_length_accepted_" + block_name2, histos)) {}
47 mc_weight_t move_remove_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_remove_c_c_cdag_cdag (blocks " << block_index1 <<
", " << block_index2 <<
")" << std::endl;
55 auto &det1 = data.dets[block_index1];
56 auto &det2 = data.dets[block_index2];
57 det_scalar_t det_ratio;
61 int det1_size = det1.size();
62 int det2_size = det2.size();
63 if (block_index1 == block_index2) {
64 if (det1_size < 2)
return 0;
66 if ((det1_size == 0) || (det2_size == 0))
return 0;
68 int num_c_dag1 = rng(det1_size), num_c1 = rng(det1_size);
69 int num_c_dag2 = rng(det2_size), num_c2 = rng(det2_size);
70 if ((block_index1 == block_index2) && ((num_c_dag1 == num_c_dag2) || (num_c1 == num_c2)))
return 0;
73 std::cerr <<
"* Proposing to remove: ";
74 std::cerr << num_c_dag1 <<
"-th Cdag(" << block_index1 <<
",...), ";
75 std::cerr << num_c1 <<
"-th C(" << block_index1 <<
",...)" << std::endl;
77 std::cerr << num_c_dag2 <<
"-th Cdag(" << block_index2 <<
",...), ";
78 std::cerr << num_c2 <<
"-th C(" << block_index2 <<
",...)" << std::endl;
82 tau1 = data.imp_trace.try_delete(num_c1, block_index1,
false);
83 tau2 = data.imp_trace.try_delete(num_c_dag1, block_index1,
true);
84 tau3 = data.imp_trace.try_delete(num_c2, block_index2,
false);
85 tau4 = data.imp_trace.try_delete(num_c_dag2, block_index2,
true);
87 dtau1 = double(tau2 - tau1);
88 dtau2 = double(tau4 - tau3);
89 if (histo_proposed1) {
90 *histo_proposed1 << dtau1;
91 *histo_proposed2 << dtau2;
94 if (block_index1 == block_index2) {
95 det_ratio = det1.try_remove2(num_c_dag1, num_c_dag2, num_c1, num_c2);
97 auto det_ratio1 = det1.try_remove(num_c_dag1, num_c1);
98 auto det_ratio2 = det2.try_remove(num_c_dag2, num_c2);
99 det_ratio = det_ratio1 * det_ratio2;
105 if (block_index1 == block_index2) {
108 t_ratio = std::pow(block_size1 * config.beta() /
double(det1_size), 4);
110 t_ratio = std::pow(block_size1 * config.beta() /
double(det1_size), 2) * std::pow(block_size2 * config.beta() /
double(det2_size), 2);
114 double random_number = rng.preview();
115 if (random_number == 0.0)
return 0;
116 double p_yee = std::abs(det_ratio / t_ratio / data.atomic_weight);
119 std::tie(new_atomic_weight, new_atomic_reweighting) = data.imp_trace.compute(p_yee, random_number);
120 if (new_atomic_weight == 0.0) {
122 std::cerr <<
"atomic_weight == 0" << std::endl;
126 auto atomic_weight_ratio = new_atomic_weight / data.atomic_weight;
127 if (!isfinite(atomic_weight_ratio))
128 TRIQS_RUNTIME_ERROR <<
"atomic_weight_ratio not finite " << new_atomic_weight <<
" " << data.atomic_weight <<
" "
129 << new_atomic_weight / data.atomic_weight <<
" in config " << config.get_id();
131 mc_weight_t p = atomic_weight_ratio * det_ratio;
134 std::cerr <<
"Trace ratio: " << atomic_weight_ratio <<
'\t';
135 std::cerr <<
"Det ratio: " << det_ratio <<
'\t';
136 std::cerr <<
"Prefactor: " << t_ratio <<
'\t';
137 std::cerr <<
"Weight: " << p / t_ratio << std::endl;
140 if (!isfinite(p)) TRIQS_RUNTIME_ERROR <<
"(remove) p not finite :" << p <<
" in config " << config.get_id();
141 if (!isfinite(p / t_ratio))
142 TRIQS_RUNTIME_ERROR <<
"p / t_ratio not finite p : " << p <<
" t_ratio : " << t_ratio <<
" in config " << config.get_id();
146 mc_weight_t move_remove_c_c_cdag_cdag::accept() {
149 data.imp_trace.confirm_delete();
159 if (block_index1 == block_index2) {
160 data.dets[block_index1].complete_operation();
162 data.dets[block_index1].complete_operation();
163 data.dets[block_index2].complete_operation();
167 data.atomic_weight = new_atomic_weight;
168 data.atomic_reweighting = new_atomic_reweighting;
170 if (histo_accepted1) {
171 *histo_accepted1 << dtau1;
172 *histo_accepted2 << dtau2;
176 std::cerr <<
"* Move move_remove_c_c_cdag_cdag accepted" << std::endl;
177 std::cerr <<
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" << std::endl;
178 check_det_sequence(data.dets[block_index1], config.get_id());
179 check_det_sequence(data.dets[block_index2], config.get_id());
182 return data.current_sign / data.old_sign;
185 void move_remove_c_c_cdag_cdag::reject() {
188 data.imp_trace.cancel_delete();
190 if (block_index1 == block_index2) {
191 data.dets[block_index1].reject_last_try();
193 data.dets[block_index1].reject_last_try();
194 data.dets[block_index2].reject_last_try();
198 std::cerr <<
"* Move move_remove_c_c_cdag_cdag rejected" << std::endl;
199 std::cerr <<
"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" << std::endl;
200 check_det_sequence(data.dets[block_index1], config.get_id());
201 check_det_sequence(data.dets[block_index2], config.get_id());