7#include "invariants.hpp"
11namespace triqs_ctseg {
13 void check_invariant(configuration_t
const &config, work_data_t
const &wdata) {
14 check_segments(config);
15 check_dets(config, wdata);
19 void check_segments(configuration_t
const &config) {
20 for (
auto const &[c, sl] : itertools::enumerate(config.seglists)) {
22 for (
int i = 0; i < sl.size(); ++i) {
23 if (i != sl.size() - 1) {
24 ALWAYS_EXPECTS((sl[i].tau_cdag > sl[i + 1].tau_c),
25 "Time order error in color {} at position {} in config \n{}", c, i, config);
26 ALWAYS_EXPECTS(not is_cyclic(sl[i]),
27 "Segment in color {} at position {} should not by cyclic in config \n{}", c, i,
30 ALWAYS_EXPECTS((sl[i].tau_cdag != sl[i].tau_c),
31 "Degenerate segment in color {} at position {} in config \n{}", c, i, config);
38 void check_dets(configuration_t
const &config, work_data_t
const &wdata) {
39 for (
auto bl : range(wdata.dets.size())) {
40 auto const &D = wdata.dets[bl];
41 auto const n_orb = wdata.gf_struct[bl].second;
44 for (
int i = 0; i < D.size() - 1; ++i) {
45 ALWAYS_EXPECTS((D.get_x(i).first < D.get_x(i + 1).first),
46 "Det time order error (cdag) in block {} at position {} in config \n{}", bl, i, config);
47 ALWAYS_EXPECTS((D.get_y(i).first < D.get_y(i + 1).first),
48 "Det time order error (c) in block {} at position {} in config \n{}", bl, i, config);
52 long n_hyb_c = 0, n_hyb_cdag = 0;
53 for (
auto c : range(n_orb)) {
54 auto const &sl = config.seglists[wdata.block_to_color(bl, c)];
56 long det_index_c = 0, det_index_cdag = 0;
57 for (
auto const &seg : sl) {
58 if (not seg.J_c and !is_full_line(seg)) {
59 ALWAYS_EXPECTS(D.size() != 0,
"Det error, block {}: there is a hybridized c but det is empty. Config: {}",
61 auto det_c_time = [&](
long i) {
return D.get_y(i).first; };
62 det_index_c = lower_bound(det_c_time, D.size(), seg.tau_c);
63 ALWAYS_EXPECTS(det_c_time(det_index_c) == seg.tau_c,
64 "Det error, block {}: tau_c = {} is not in det! Config: {}", bl, seg.tau_c, config);
67 if (not seg.J_cdag and !is_full_line(seg)) {
68 ALWAYS_EXPECTS(D.size() != 0,
69 "Det error, block {}: there is a hybridized cdag but det is empty. Config: {}", bl,
71 auto det_cdag_time = [&](
long i) {
return D.get_x(i).first; };
72 det_index_cdag = lower_bound(det_cdag_time, D.size(), seg.tau_cdag);
73 ALWAYS_EXPECTS(det_cdag_time(det_index_cdag) == seg.tau_cdag,
74 "Det error, block {}: tau_cdag = {} is not in det! Config: {}", bl, seg.tau_cdag, config);
80 ALWAYS_EXPECTS(n_hyb_c == D.size(),
"Det error, block {}: missing {} c times in det. Config: {}", bl,
81 D.size() - n_hyb_c, config);
82 ALWAYS_EXPECTS(n_hyb_cdag == D.size(),
"Det error, block {}: missing {} cdag times in det. Config: {}", bl,
83 D.size() - n_hyb_cdag, config);
88 void check_jlines(configuration_t
const &config) {
90 auto const &jl = config.Jperp_list;
91 if (jl.empty())
return;
92 std::vector<tau_t> Splus, Sminus;
93 for (
auto const &[i, line] : itertools::enumerate(config.Jperp_list)) {
94 Splus.push_back(line.tau_Splus);
95 Sminus.push_back(line.tau_Sminus);
97 std::sort(Splus.begin(), Splus.end());
98 std::sort(Sminus.begin(), Sminus.end());
100 for (
auto const &[c, sl] : itertools::enumerate(config.seglists)) {
102 auto Sminus_ = Sminus;
104 for (
int i = 0; i < sl.size(); ++i) {
106 auto splus_it = std::lower_bound(Splus_.begin(), Splus_.end(), sl[i].tau_c);
107 auto sminus_it = std::lower_bound(Sminus_.begin(), Sminus_.end(), sl[i].tau_c);
109 if (splus_it != Splus_.end()) tau_plus = *splus_it;
110 if (sminus_it != Sminus_.end()) tau_minus = *sminus_it;
111 bool time_in_jlist = sl[i].tau_c == tau_plus or sl[i].tau_c == tau_minus;
114 "Error: the c in segment at position {} in color {} has a J flag but is not in J list. Config : \n{}", i,
116 if (sl[i].tau_c == tau_plus)
117 Splus_.erase(splus_it);
119 Sminus_.erase(sminus_it);
122 auto splus_it = std::lower_bound(Splus_.begin(), Splus_.end(), sl[i].tau_cdag);
123 auto sminus_it = std::lower_bound(Sminus_.begin(), Sminus_.end(), sl[i].tau_cdag);
125 if (splus_it != Splus_.end()) tau_plus = *splus_it;
126 if (sminus_it != Sminus_.end()) tau_minus = *sminus_it;
127 bool time_in_jlist = sl[i].tau_cdag == tau_plus or sl[i].tau_cdag == tau_minus;
130 "Error: the cdag in segment at position {} in color {} has a J flag but is not in J list. Config : \n{}",
132 if (sl[i].tau_cdag == tau_plus)
133 Splus_.erase(splus_it);
135 Sminus_.erase(sminus_it);
138 ALWAYS_EXPECTS(Splus_.empty() and Sminus_.empty(),
139 "Error: some spin lines do not have corresponding tags on segments. Config: \n{}", config);
static tau_t zero()
$\tau = 0$