11#include "work_data.hpp"
13namespace triqs_ctseg {
41 tau_t tau_c, tau_cdag;
42 bool J_c =
false, J_cdag =
false;
45 [[nodiscard]] tau_t length()
const {
return tau_c - tau_cdag; };
52 using vec_seg_iter_t = std::vector<segment_t>::const_iterator;
59 tau_t tau_Sminus, tau_Splus;
64 struct colored_ops_t {
73 struct configuration_t {
76 std::vector<std::vector<segment_t>> seglists;
79 std::vector<Jperp_line_t> Jperp_list;
82 configuration_t(
int n_color) : seglists(n_color) {}
85 long n_segments()
const {
86 return std::accumulate(begin(seglists), end(seglists), 0l, [](
long r,
auto &v) {
return r + v.size(); });
90 long Jperp_order()
const {
return Jperp_list.size(); }
93 long Delta_order()
const {
return n_segments() - 2 * Jperp_order(); }
96 [[nodiscard]]
int n_color()
const {
return seglists.size(); }
103 inline bool operator<(segment_t
const &s1, segment_t
const &s2) {
return s1.tau_c > s2.tau_c; };
107 inline bool operator==(segment_t
const &s1, segment_t
const &s2) {
108 return s1.tau_c == s2.tau_c and s1.tau_cdag == s2.tau_cdag;
113 inline bool is_cyclic(segment_t
const &seg) {
return seg.tau_cdag > seg.tau_c; }
116 inline bool is_full_line(segment_t
const &seg) {
return seg == segment_t::full_line(); }
119 double overlap(segment_t
const &s1, segment_t
const &s2);
122 inline segment_t flip(segment_t
const &s) {
return {s.tau_cdag, s.tau_c}; }
127 vec_seg_iter_t lower_bound(std::vector<segment_t>
const &seglist,
tau_t const &tau);
131 int n_at_boundary(std::vector<segment_t>
const &seglist);
134 int n_tau(
tau_t const &tau, std::vector<segment_t>
const &seglist);
137 std::vector<segment_t> flip(std::vector<segment_t>
const &sl);
140 double overlap(std::vector<segment_t>
const &seglist, segment_t
const &seg);
144 bool is_insertable_into(segment_t
const &seg, std::vector<segment_t>
const &seglist);
147 std::vector<long> cdag_in_window(
tau_t const &wtau_left,
tau_t const &wtau_right,
148 std::vector<segment_t>
const &seglist);
155 inline void fix_ordering_first_last(std::vector<segment_t> &sl) {
156 if (sl.size() <= 1)
return;
157 if (is_cyclic(sl[0])) std::rotate(begin(sl), begin(sl) + 1, end(sl));
158 if (sl.back().tau_c > sl[0].tau_c) std::rotate(begin(sl), end(sl) - 1, end(sl));
163 double K_overlap(std::vector<segment_t>
const &seglist,
tau_t const &tau_c,
tau_t const &tau_cdag,
164 gf<imtime, matrix_valued>
const &K,
int c1,
int c2);
167 double K_overlap(std::vector<segment_t>
const &seglist,
tau_t const &tau,
bool is_c,
168 gf<imtime, matrix_valued>
const &K,
int c1,
int c2);
171 std::vector<colored_ops_t> colored_ordered_ops(std::vector<std::vector<segment_t>>
const &seglists);
175 std::ostream &operator<<(std::ostream &out, std::vector<segment_t>
const &sl);
177 std::ostream &operator<<(std::ostream &out, configuration_t
const &config);
179 std::ostream &operator<<(std::ostream &out, std::vector<colored_ops_t>
const &col);
183template <>
struct fmt::formatter<triqs_ctseg::configuration_t> : ostream_formatter {};
185template <>
struct fmt::formatter<std::vector<triqs_ctseg::colored_ops_t>> : ostream_formatter {};
static tau_t beta()
tau_t at tau = beta
static tau_t zero()
$\tau = 0$