31#include <mpi/communicator.hpp>
42namespace triqs::mc_tools {
45 template <DoubleOrComplex MCSignType>
class measure_set;
62 template <DoubleOrComplex MCSignType>
class measure {
65 struct measure_concept {
66 virtual ~measure_concept() =
default;
69 [[nodiscard]]
virtual std::string
report()
const = 0;
70 virtual void h5write(h5::group, std::string
const &)
const = 0;
71 virtual void h5read(h5::group, std::string
const &) = 0;
74 [[nodiscard]]
virtual std::string ms_get_timings(std::string
const &)
const = 0;
75 [[nodiscard]]
virtual std::vector<std::string> ms_names()
const = 0;
81 struct measure_model :
public measure_concept {
82 static constexpr bool is_measure_set = std::is_same_v<T, measure_set<MCSignType>>;
84 measure_model(T m) : measure_{std::move(m)} {}
85 void accumulate(MCSignType sign)
override {
return measure_.accumulate(sign); }
86 void collect_results(mpi::communicator
const &c)
override { measure_.collect_results(c); }
87 [[nodiscard]] std::string
report()
const override {
88 if constexpr (
requires {
89 { measure_.report() } -> std::convertible_to<std::string>;
91 return measure_.report();
94 void h5write(h5::group g, std::string
const &name)
const override {
95 if constexpr (h5::Storable<T>) h5::write(g, name, measure_);
97 void h5read(h5::group g, std::string
const &name)
override {
98 if constexpr (h5::Storable<T>) h5::read(g, name, measure_);
102 [[nodiscard]] std::string ms_get_timings(std::string
const &prefix)
const override {
103 if constexpr (is_measure_set)
return measure_.get_timings(prefix);
106 [[nodiscard]] std::vector<std::string> ms_names()
const override {
107 if constexpr (is_measure_set)
return measure_.names();
121 template <
typename T>
123 measure(T m,
bool enable_timer,
bool enable_report)
124 : ptr_{std::make_unique<measure_model<T>>(std::move(m))},
125 enable_timer_(enable_timer),
126 enable_report_(enable_report),
127 is_measure_set_{std::is_same_v<T, measure_set<MCSignType>>} {}
148 if (enable_timer_) timer_.start();
149 ptr_->accumulate(sign);
150 if (enable_timer_) timer_.stop();
166 [[nodiscard]] std::string
report()
const;
176 [[nodiscard]] std::string
get_timings(std::string
const &name, std::string
const &prefix =
"")
const;
183 [[nodiscard]] std::vector<std::string>
names()
const;
186 [[nodiscard]]
double duration()
const;
189 [[nodiscard]]
auto count()
const {
return count_; }
192 [[nodiscard]]
auto is_set()
const {
return is_measure_set_; }
203 friend void h5_write(h5::group g, std::string
const &name,
measure const &m) { m.ptr_->h5write(g, name); }
214 friend void h5_read(h5::group g, std::string
const &name,
measure &m) { m.ptr_->h5read(g, name); }
217 std::unique_ptr<measure_concept> ptr_;
218 std::uint64_t count_{0};
220 bool enable_timer_{
false};
221 bool enable_report_{
false};
222 bool is_measure_set_{
false};
Accumulating wall-clock timer based on std::chrono::high_resolution_clock.
A wall-clock timer that accumulates elapsed seconds across start/stop intervals.