28 #include <boost/algorithm/string.hpp>
30 template <
class Matrix,
class SymmGroup>
36 , dns( (parms[
"donotsave"] != 0) )
37 , chkpfile(boost::trim_right_copy_if(parms[
"chkpfile"].str(), boost::is_any_of(
"/ ")))
38 , rfile(parms[
"resultfile"].str())
39 , stop_callback(static_cast<double>(parms[
"run_seconds"]))
42 storage::setup(
parms);
47 if (boost::filesystem::exists(p) && boost::filesystem::exists(p /
"mps0.h5"))
60 maquis::cout <<
"Restoring state." << std::endl;
61 maquis::cout <<
"Will start again at site " <<
init_site <<
" in sweep " << init_sweep << std::endl;
64 maquis::cout <<
"A fresh simulation will start." << std::endl;
73 ar[
"/parameters"] <<
parms;
78 if (!boost::filesystem::exists(
chkpfile))
79 boost::filesystem::create_directory(
chkpfile);
82 ar[
"/parameters"] <<
parms;
92 all_measurements << overlap_measurements<Matrix, SymmGroup>(
parms);
98 }
else if (!
parms[
"initfile"].empty()) {
99 maquis::cout <<
"Loading init state from " <<
parms[
"initfile"] << std::endl;
105 assert(
mps.length() == lat.size());
106 maquis::cout <<
"MPS initialization has finished...\n";
110 template <
class Matrix,
class SymmGroup>
115 mymeas << overlap_measurements<Matrix, SymmGroup>(parms, sweep);
118 if (!parms[
"ALWAYS_MEASURE"].empty())
119 sweep_measurements =
meas_sublist(mymeas, parms[
"ALWAYS_MEASURE"]);
121 return sweep_measurements;
125 template <
class Matrix,
class SymmGroup>
130 template <
class Matrix,
class SymmGroup>
135 if (!boost::filesystem::exists(chkpfile))
136 boost::filesystem::create_directory(chkpfile);
138 save(chkpfile, state);
142 ar[
"/status"] << status;
146 template <
class Matrix,
class SymmGroup>
149 std::ostringstream oss;
151 #if defined(__xlC__) || defined(__FCC_VERSION)
152 typename status_type::const_iterator match = status.find(
"sweep");
153 oss <<
"/spectrum/iteration/" << match->second;
155 oss <<
"/spectrum/iteration/" << status.at(
"sweep");
160 template <
class Matrix,
class SymmGroup>
163 maquis::cout <<
"Measurements." << std::endl;
167 std::vector<int> * measure_es_where = NULL;
169 if (!parms[
"entanglement_spectra"].empty()) {
171 measure_es_where =
new std::vector<int>();
172 *measure_es_where = parms.template get<std::vector<int> >(
"entanglement_spectra");
174 std::vector<double> entropies, renyi2;
175 if (parms[
"MEASURE[Entropy]"]) {
176 maquis::cout <<
"Calculating vN entropy." << std::endl;
179 if (parms[
"MEASURE[Renyi2]"]) {
180 maquis::cout <<
"Calculating n=2 Renyi entropy." << std::endl;
186 if (entropies.size() > 0)
187 ar[archive_path +
"/Entropy/mean/value"] << entropies;
188 if (renyi2.size() > 0)
189 ar[archive_path +
"/Renyi2/mean/value"] << renyi2;
191 ar[archive_path +
"/Entanglement Spectra/mean/value"] << *spectra;
Model< Matrix, SymmGroup >::measurements_type measurements_type
void load(alps::hdf5::archive &ar, std::string const &path, TrivialGroup::charge &value, std::vector< std::size_t > chunk=std::vector< std::size_t >(), std::vector< std::size_t > offset=std::vector< std::size_t >())
virtual void measure(std::string archive_path, measurements_type &meas)
MPO< Matrix, SymmGroup > make_mpo(Lattice const &lat, Model< Matrix, SymmGroup > const &model, BaseParameters &parms)
std::vector< double > calculate_bond_entropies(MPS< Matrix, SymmGroup > &mps)
MPS< Matrix, SymmGroup > mps
measurements_type iteration_measurements(int sweep)
Model< Matrix, SymmGroup > model
std::vector< std::pair< std::vector< std::string >, std::vector< double > > > entanglement_spectrum_type
std::map< std::string, int > status_type
virtual void checkpoint_simulation(MPS< Matrix, SymmGroup > const &state, status_type const &)
virtual std::string results_archive_path(status_type const &) const
boost::ptr_vector< measurement< Matrix, SymmGroup > > meas_sublist(boost::ptr_vector< measurement< Matrix, SymmGroup > > const &m, std::vector< std::string > const &meas_list)
bool is_data(const char *path)
#define DMRG_VERSION_STRING
void save(alps::hdf5::archive &ar, std::string const &path, TrivialGroup::charge const &value, std::vector< std::size_t > size=std::vector< std::size_t >(), std::vector< std::size_t > chunk=std::vector< std::size_t >(), std::vector< std::size_t > offset=std::vector< std::size_t >())
measurements_type all_measurements
sim(DmrgParameters const &)
std::vector< double > calculate_bond_renyi_entropies(MPS< Matrix, SymmGroup > &mps, double n, std::vector< int > *measure_es_where=NULL, entanglement_spectrum_type *spectra=NULL)
MPO< Matrix, SymmGroup > mpo
bool is_scalar(const char *path)