9#include <triqs/gfs.hpp>
10using namespace triqs::gfs;
12namespace triqs_ctseg {
14 inline long modulo(
long i,
long N) {
return (i + N) % N; }
18 long lower_bound(
auto f,
long N,
auto const &value) {
19 long first = 0, count = N;
22 long step = count / 2;
23 assert(first + step < N);
24 if (f(first + step) < value) {
34 long det_lower_bound_x(
auto const &d,
auto const &x) {
35 return lower_bound([&d](
long i) {
return d.get_x(i).first; }, d.size(), x);
37 long det_lower_bound_y(
auto const &d,
auto const &y) {
38 return lower_bound([&d](
long i) {
return d.get_y(i).first; }, d.size(), y);
42 constexpr unsigned int ipow(
unsigned int n,
unsigned int m) {
return m == 0 ? 1 : m == 1 ? n : n * ipow(n, m - 1); }
45 template <
typename M> block2_gf<M> make_block2_gf(M
const &m, gf_struct_t
const &gf_struct) {
47 std::vector<std::vector<gf<M>>> gf_vecvec;
48 std::vector<std::string> block_names;
50 for (
auto const &[bl1, bl1_size] : gf_struct) {
51 block_names.push_back(bl1);
52 std::vector<gf<M>> gf_vec;
53 for (
auto const &[bl2, bl2_size] : gf_struct) { gf_vec.emplace_back(m, make_shape(bl1_size, bl2_size)); }
54 gf_vecvec.emplace_back(std::move(gf_vec));
57 return make_block2_gf(block_names, block_names, std::move(gf_vecvec));