68 template <DoubleOrComplex MCSignType>
class move {
72 virtual ~move_concept() =
default;
73 virtual MCSignType
attempt() = 0;
74 virtual MCSignType
accept() = 0;
76 virtual void calibrate(mpi::communicator
const &) = 0;
78 virtual void h5write(h5::group, std::string
const &)
const = 0;
79 virtual void h5read(h5::group, std::string
const &) = 0;
82 virtual void ms_clear_statistics() = 0;
83 [[nodiscard]]
virtual std::string ms_get_statistics(std::string
const &)
const = 0;
84 [[nodiscard]]
virtual std::map<std::string, double> ms_get_acceptance_rates()
const = 0;
85 [[nodiscard]]
virtual std::string ms_get_timings(std::string
const &)
const = 0;
91 struct move_model :
public move_concept {
92 static constexpr bool is_move_set = std::is_same_v<T, move_set<MCSignType>>;
94 move_model(T m) : move_{std::move(m)} {}
95 MCSignType
attempt()
override {
return move_.attempt(); }
96 MCSignType
accept()
override {
return move_.accept(); }
98 if constexpr (
requires { move_.reject(); }) move_.reject();
100 void calibrate(mpi::communicator
const &c)
override {
101 if constexpr (
requires { move_.calibrate(c); }) move_.calibrate(c);
104 if constexpr (
requires { move_.collect_statistics(c); }) move_.collect_statistics(c);
106 void h5write(h5::group g, std::string
const &name)
const override {
107 if constexpr (h5::Storable<T>) h5::write(g, name, move_);
109 void h5read(h5::group g, std::string
const &name)
override {
110 if constexpr (h5::Storable<T>) h5::read(g, name, move_);
114 void ms_clear_statistics()
override {
115 if constexpr (is_move_set) move_.clear_statistics();
117 [[nodiscard]] std::string ms_get_statistics(std::string
const &prefix)
const override {
118 if constexpr (is_move_set)
return move_.get_statistics(prefix);
121 [[nodiscard]] std::map<std::string, double> ms_get_acceptance_rates()
const override {
122 if constexpr (is_move_set)
return move_.get_acceptance_rates();
125 [[nodiscard]] std::string ms_get_timings(std::string
const &prefix)
const override {
126 if constexpr (is_move_set)
return move_.get_timings(prefix);
138 template <
typename T>
140 move(T m) : ptr_{std::make_unique<move_model<T>>(std::move(m))}, is_move_set_{std::is_same_v<T, move_set<MCSignType>>} {}
161 auto result = ptr_->attempt();
173 auto result = ptr_->accept();
193 void calibrate(mpi::communicator
const &c) { ptr_->calibrate(c); }
227 [[nodiscard]] std::string
get_statistics(std::string
const &name, std::string
const &prefix =
"")
const;
236 [[nodiscard]] std::string
get_timings(std::string
const &name, std::string
const &prefix =
"")
const;
239 [[nodiscard]]
double duration()
const {
return static_cast<double>(timer_); }
246 [[nodiscard]] std::map<std::string, double>
get_acceptance_rates()
const {
return ptr_->ms_get_acceptance_rates(); }
249 [[nodiscard]]
auto is_set()
const {
return is_move_set_; }
260 friend void h5_write(h5::group g, std::string
const &name,
move const &m) { m.ptr_->h5write(g, name); }
271 friend void h5_read(h5::group g, std::string
const &name,
move &m) { m.ptr_->h5read(g, name); }
274 std::unique_ptr<move_concept> ptr_;
275 std::uint64_t nprop_{0};
276 std::uint64_t nacc_{0};
277 double acc_rate_{-1};
278 bool is_move_set_{
false};
279 triqs::utility::timer timer_;