32 #ifndef INPUT_OUTPUT_H_ 33 #define INPUT_OUTPUT_H_ 43 template <
typename Derived>
71 template <
typename InputIterator>
72 internal::IOManipRange<InputIterator>
73 disp(InputIterator first, InputIterator last,
const std::string& separator,
74 const std::string& start =
"[",
const std::string& end =
"]") {
89 template <
typename Container>
90 internal::IOManipRange<typename Container::const_iterator>
91 disp(
const Container& c,
const std::string& separator,
92 const std::string& start =
"[",
const std::string& end =
"]",
95 std::begin(c), std::end(c), separator, start, end);
108 template <
typename Po
interType>
109 internal::IOManipPointer<PointerType>
110 disp(
const PointerType* p,
idx N,
const std::string& separator,
111 const std::string& start =
"[",
const std::string& end =
"]") {
123 template <
typename Derived>
124 void save(
const Eigen::MatrixBase<Derived>& A,
const std::string& fname) {
134 fout.open(fname, std::ios::out | std::ios::binary);
137 throw std::runtime_error(
"qpp::save(): Error writing output file \"" +
138 std::string(fname) +
"\"!");
143 const std::string header_ =
"TYPE::Eigen::Matrix";
144 fout.write(header_.c_str(), header_.length());
146 idx rows =
static_cast<idx>(rA.rows());
147 idx cols =
static_cast<idx>(rA.cols());
148 fout.write(reinterpret_cast<const char*>(&rows),
sizeof(rows));
149 fout.write(reinterpret_cast<const char*>(&cols),
sizeof(cols));
151 fout.write(reinterpret_cast<const char*>(rA.data()),
152 sizeof(
typename Derived::Scalar) * rows * cols);
174 template <
typename Derived>
177 fin.open(fname, std::ios::in | std::ios::binary);
182 throw std::runtime_error(
"qpp::load(): Error opening input file \"" +
183 std::string(fname) +
"\"!");
186 const std::string header_ =
"TYPE::Eigen::Matrix";
187 std::unique_ptr<char[]> fheader_{
new char[header_.length()]};
190 fin.read(fheader_.get(), header_.length());
191 if (std::string(fheader_.get(), header_.length()) != header_) {
192 throw std::runtime_error(
"qpp::load(): Input file \"" +
193 std::string(fname) +
"\" is corrupted!");
198 fin.read(reinterpret_cast<char*>(&rows),
sizeof(rows));
199 fin.read(reinterpret_cast<char*>(&cols),
sizeof(cols));
203 fin.read(reinterpret_cast<char*>(A.data()),
204 sizeof(
typename Derived::Scalar) * rows * cols);
bool check_nonzero_size(const T &x) noexcept
Definition: util.h:123
constexpr double chop
Used in qpp::disp() for setting to zero numbers that have their absolute value smaller than qpp::chop...
Definition: constants.h:60
Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic > dyn_mat
Dynamic Eigen matrix over the field specified by Scalar.
Definition: types.h:81
Quantum++ main namespace.
Definition: circuits.h:35
Checks whether T is compatible with an STL-like iterable container.
Definition: traits.h:71
Definition: iomanip.h:117
std::complex< double > cplx
Complex number in double precision.
Definition: types.h:49
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:175
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:124
std::size_t idx
Non-negative integer index, make sure you use an unsigned type.
Definition: types.h:39
internal::IOManipEigen disp(const Eigen::MatrixBase< Derived > &A, double chop=qpp::chop)
Eigen expression ostream manipulator.
Definition: input_output.h:44
Object has zero size exception.
Definition: exception.h:134