13 namespace fs = std::filesystem;
32 mpi::broadcast(x.
mu, c, root);
40 auto g2 = g.create_group(name);
41 h5::write(g2,
"mu", data.
mu);
47 auto g2 = g.open_group(name);
48 h5::read(g2,
"mu", data.
mu);
61 std::string _iter_file;
65 std::string group_name;
68 [[nodiscard]] h5path path_iteration(
long n)
const {
return {_iter_file, std::to_string(n)}; }
70 template <
typename T> [[nodiscard]] T read(h5path p)
const {
return h5::read<T>(h5::file(p.file,
'r'), p.group_name); }
77 throw std::runtime_error{fmt::format(
"Checkpoint: '{}' exists but is not a directory",
dirname)};
78 auto file = h5::file(_iter_file,
'r');
79 _n_iter = long(h5::group{file}.get_all_subgroup_dataset_names().
size());
82 h5::file(_iter_file,
'w');
86 [[nodiscard]] std::string
dirname()
const {
return _dirname.string(); }
87 [[nodiscard]]
long size()
const {
return _n_iter; }
88 [[nodiscard]]
bool empty()
const {
return _n_iter == 0; }
90 [[nodiscard]] IterationData
last()
const {
91 if (
empty())
throw std::runtime_error{
"Checkpoint: no iterations stored"};
95 void append(IterationData
const &x) {
96 auto p = path_iteration(_n_iter);
97 auto f = h5::file(p.file,
'a');
98 auto root = h5::group{f};
99 h5::write(root, p.group_name, x);
104 if (i < 0) i +=
size();
105 if (i < 0 || i >=
size())
throw std::out_of_range{fmt::format(
"Checkpoint: index {} out of range [0, {})", i,
size())};
106 return read<IterationData>(path_iteration(i));
116 IterationData
operator*()
const {
return (*_cp)[_idx]; }
129 template class checkpoint<iteration_data>;
const_iterator & operator++()
const_iterator(checkpoint const *cp, long idx)
IterationData operator*() const
bool operator!=(const_iterator const &other) const
void append(IterationData const &x)
std::string dirname() const
IterationData operator[](long i) const
IterationData last() const
const_iterator begin() const
checkpoint(std::string dirname)
Open existing or create new checkpoint directory.
const_iterator end() const
std::vector< nda::matrix< dcomplex > > block_mat_t
void h5_read(h5::group g, std::string const &name, iteration_data &data)
void h5_write(h5::group g, std::string const &name, iteration_data const &data)
block_gf< imtime, matrix_valued > block_gf_imtime_t
block_gf< imfreq, matrix_valued > block_gf_imfreq_t
Minimal iteration data required to restart a DMFT loop.
C2PY_IGNORE friend void mpi_broadcast(iteration_data &x, mpi::communicator c={}, int root=0)
std::vector< block_mat_t > Sigma_hartree_list
std::vector< block_gf_imfreq_t > Sigma_imp_list