27 #ifndef INPUT_OUTPUT_H_
28 #define INPUT_OUTPUT_H_
42 template<
typename Derived>
72 template<
typename InputIterator>
75 const std::string& separator,
76 const std::string& start =
"[",
77 const std::string& end =
"]")
80 first, last, separator, start, end);
93 template<
typename Container>
95 const Container& c,
const std::string& separator,
96 const std::string& start =
"[",
const std::string& end =
"]",
100 std::begin(c), std::end(c), separator, start, end);
113 template<
typename Po
interType>
115 const std::string& separator,
116 const std::string& start =
"[",
117 const std::string& end =
"]")
130 template<
typename Derived>
131 void save(
const Eigen::MatrixBase<Derived>& A,
const std::string& fname)
142 fout.open(fname, std::ios::out | std::ios::binary);
146 throw std::runtime_error(
147 "qpp::save(): Error writing output file \""
148 + std::string(fname) +
"\"!");
153 const std::string header_ =
"TYPE::Eigen::Matrix";
154 fout.write(header_.c_str(), header_.length());
156 idx rows =
static_cast<idx>(rA.rows());
157 idx cols =
static_cast<idx>(rA.cols());
158 fout.write(reinterpret_cast<const char*>(&rows),
sizeof(rows));
159 fout.write(reinterpret_cast<const char*>(&cols),
sizeof(cols));
161 fout.write(reinterpret_cast<const char*>(rA.data()),
162 sizeof(
typename Derived::Scalar) * rows * cols);
184 template<
typename Derived>
188 fin.open(fname, std::ios::in | std::ios::binary);
194 throw std::runtime_error(
195 "qpp::load(): Error opening input file \""
196 + std::string(fname) +
"\"!");
199 const std::string header_ =
"TYPE::Eigen::Matrix";
200 std::unique_ptr<char[]> fheader_{
new char[header_.length()]};
203 fin.read(fheader_.get(), header_.length());
204 if (std::string(fheader_.get(), header_.length()) != header_)
206 throw std::runtime_error(
207 "qpp::load(): Input file \"" + std::string(fname)
208 +
"\" is corrupted!");
213 fin.read(reinterpret_cast<char*>(&rows),
sizeof(rows));
214 fin.read(reinterpret_cast<char*>(&cols),
sizeof(cols));
218 fin.read(reinterpret_cast<char*>(A.data()),
219 sizeof(
typename Derived::Scalar) * rows * cols);
bool check_nonzero_size(const T &x) noexcept
Definition: util.h:127
constexpr double chop
Used in qpp::disp() for setting to zero numbers that have their absolute value smaller than qpp::chop...
Definition: constants.h:59
Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic > dyn_mat
Dynamic Eigen matrix over the field specified by Scalar.
Definition: types.h:78
Quantum++ main namespace.
Definition: codes.h:30
Checks whether T is compatible with an STL-like iterable container.
Definition: traits.h:52
Definition: iomanip.h:121
std::complex< double > cplx
Complex number in double precision.
Definition: types.h:46
Generates custom exceptions, used when validating function parameters.
Definition: exception.h:39
dyn_mat< typename Derived::Scalar > load(const std::string &fname)
Loads Eigen matrix from a binary file (internal format) in double precision.
Definition: input_output.h:185
void save(const Eigen::MatrixBase< Derived > &A, const std::string &fname)
Saves Eigen expression to a binary file (internal format) in double precision.
Definition: input_output.h:131
std::size_t idx
Non-negative integer index.
Definition: types.h:36
internal::IOManipEigen disp(const Eigen::MatrixBase< Derived > &A, double chop=qpp::chop)
Eigen expression ostream manipulator.
Definition: input_output.h:43