Loading include/dca/io/hdf5/hdf5_reader.hpp +45 −21 Original line number Diff line number Diff line Loading @@ -63,20 +63,23 @@ public: // `execute` returns true if the object is read correctly. template <typename scalartype> bool execute(std::string name, scalartype& value); bool execute(const std::string& name, scalartype& value); template <typename Scalar> bool execute(std::string name, std::vector<Scalar>& value); bool execute(const std::string& name, std::vector<Scalar>& value); template <typename Scalar> bool execute(std::string name, std::vector<std::complex<Scalar>>& value); bool execute(const std::string& name, std::vector<std::complex<Scalar>>& value); template <typename Scalar> bool execute(std::string name, std::vector<std::vector<Scalar>>& value); bool execute(const std::string& name, std::vector<std::vector<Scalar>>& value); bool execute(std::string name, std::string& value); template <typename Scalar, std::size_t n> bool execute(const std::string& name, std::vector<std::array<Scalar, n>>& value); bool execute(std::string name, std::vector<std::string>& value); bool execute(const std::string& name, std::string& value); bool execute(const std::string& name, std::vector<std::string>& value); // TODO: Remove? (only thing that depends on domains.hpp) template <typename domain_type> Loading @@ -88,24 +91,26 @@ public: bool execute(func::function<scalartype, domain_type>& f); template <typename scalartype, typename domain_type> bool execute(std::string name, func::function<scalartype, domain_type>& f); bool execute(const std::string& name, func::function<scalartype, domain_type>& f); template <typename Scalar> bool execute(std::string name, dca::linalg::Vector<Scalar, dca::linalg::CPU>& A); bool execute(const std::string& name, dca::linalg::Vector<Scalar, dca::linalg::CPU>& A); template <typename Scalar> bool execute(std::string name, dca::linalg::Vector<std::complex<Scalar>, dca::linalg::CPU>& A); bool execute(const std::string& name, dca::linalg::Vector<std::complex<Scalar>, dca::linalg::CPU>& A); template <typename Scalar> bool execute(std::string name, dca::linalg::Matrix<Scalar, dca::linalg::CPU>& A); bool execute(const std::string& name, dca::linalg::Matrix<Scalar, dca::linalg::CPU>& A); template <typename Scalar> bool execute(std::string name, dca::linalg::Matrix<std::complex<Scalar>, dca::linalg::CPU>& A); bool execute(const std::string& name, dca::linalg::Matrix<std::complex<Scalar>, dca::linalg::CPU>& A); template <typename Scalar> bool execute(dca::linalg::Matrix<Scalar, dca::linalg::CPU>& A); bool execute(std::string name, io::Buffer& buff) { bool execute(const std::string& name, io::Buffer& buff) { return execute(name, static_cast<io::Buffer::Container&>(buff)); } Loading @@ -130,7 +135,7 @@ void HDF5Reader::from_file(arbitrary_struct_t& arbitrary_struct, std::string fil } template <typename Scalar> bool HDF5Reader::execute(std::string name, Scalar& value) { bool HDF5Reader::execute(const std::string& name, Scalar& value) { std::string full_name = get_path() + "/" + name; if (!exists(full_name)) { Loading @@ -142,7 +147,7 @@ bool HDF5Reader::execute(std::string name, Scalar& value) { } template <typename Scalar> bool HDF5Reader::execute(std::string name, std::vector<Scalar>& value) { bool HDF5Reader::execute(const std::string& name, std::vector<Scalar>& value) { std::string full_name = get_path() + "/" + name; if (!exists(full_name)) { Loading @@ -158,7 +163,7 @@ bool HDF5Reader::execute(std::string name, std::vector<Scalar>& value) { } template <typename Scalar> bool HDF5Reader::execute(std::string name, std::vector<std::complex<Scalar>>& value) { bool HDF5Reader::execute(const std::string& name, std::vector<std::complex<Scalar>>& value) { std::string full_name = get_path() + "/" + name; if (!exists(full_name)) { Loading @@ -174,7 +179,7 @@ bool HDF5Reader::execute(std::string name, std::vector<std::complex<Scalar>>& va } template <typename Scalar> bool HDF5Reader::execute(std::string name, std::vector<std::vector<Scalar>>& value) { bool HDF5Reader::execute(const std::string& name, std::vector<std::vector<Scalar>>& value) { std::string full_name = get_path() + "/" + name; if (!exists(full_name)) { return false; Loading Loading @@ -215,13 +220,32 @@ bool HDF5Reader::execute(std::string name, std::vector<std::vector<Scalar>>& val return true; } template <typename Scalar, std::size_t n> bool HDF5Reader::execute(const std::string& name, std::vector<std::array<Scalar, n>>& value) { std::string full_name = get_path() + "/" + name; if (!exists(full_name)) { return false; } auto dims = readSize(full_name); assert(dims.size() == 2); if (dims.at(1) != n) { throw(std::length_error("Wrong array size")); } value.resize(dims[0]); read(full_name, HDF5_TYPE<Scalar>::get_PredType(), value.data()); return true; } template <typename scalartype, typename domain_type> bool HDF5Reader::execute(func::function<scalartype, domain_type>& f) { return execute(f.get_name(), f); } template <typename scalartype, typename domain_type> bool HDF5Reader::execute(std::string name, func::function<scalartype, domain_type>& f) { bool HDF5Reader::execute(const std::string& name, func::function<scalartype, domain_type>& f) { std::string full_name = get_path() + "/" + name; if (!exists(full_name)) { Loading @@ -238,7 +262,7 @@ bool HDF5Reader::execute(std::string name, func::function<scalartype, domain_typ } template <typename Scalar> bool HDF5Reader::execute(std::string name, dca::linalg::Vector<Scalar, dca::linalg::CPU>& V) { bool HDF5Reader::execute(const std::string& name, dca::linalg::Vector<Scalar, dca::linalg::CPU>& V) { std::string full_name = get_path() + "/" + name; if (!exists(full_name)) { return false; Loading @@ -254,7 +278,7 @@ bool HDF5Reader::execute(std::string name, dca::linalg::Vector<Scalar, dca::lina } template <typename Scalar> bool HDF5Reader::execute(std::string name, bool HDF5Reader::execute(const std::string& name, dca::linalg::Vector<std::complex<Scalar>, dca::linalg::CPU>& V) { std::string full_name = get_path() + "/" + name; if (!exists(full_name)) { Loading @@ -271,7 +295,7 @@ bool HDF5Reader::execute(std::string name, } template <typename Scalar> bool HDF5Reader::execute(std::string name, dca::linalg::Matrix<Scalar, dca::linalg::CPU>& A) { bool HDF5Reader::execute(const std::string& name, dca::linalg::Matrix<Scalar, dca::linalg::CPU>& A) { std::string full_name = get_path() + "/" + name; if (!exists(full_name)) { return false; Loading @@ -296,7 +320,7 @@ bool HDF5Reader::execute(std::string name, dca::linalg::Matrix<Scalar, dca::lina } template <typename Scalar> bool HDF5Reader::execute(std::string name, bool HDF5Reader::execute(const std::string& name, dca::linalg::Matrix<std::complex<Scalar>, dca::linalg::CPU>& A) { std::string full_name = get_path() + "/" + name; if (!exists(full_name)) { Loading include/dca/io/hdf5/hdf5_writer.hpp +1 −1 Original line number Diff line number Diff line Loading @@ -257,7 +257,7 @@ void HDF5Writer::execute(const std::string& name, const std::vector<std::array<S if (value.size() == 0) return; std::array<hsize_t, 2> dims{value.size(), n}; std::vector<hsize_t> dims{value.size(), n}; std::string full_name = get_path() + "/" + name; write(full_name, dims, HDF5_TYPE<Scalar>::get_PredType(), value.data()); Loading src/io/hdf5/hdf5_reader.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -57,7 +57,7 @@ std::string HDF5Reader::get_path() { return path; } bool HDF5Reader::execute(std::string name, std::string& value) { bool HDF5Reader::execute(const std::string& name, std::string& value) { std::string full_name = get_path() + "/" + name; if (!exists(full_name)) { Loading @@ -72,7 +72,7 @@ bool HDF5Reader::execute(std::string name, std::string& value) { return true; } bool HDF5Reader::execute(std::string name, std::vector<std::string>& value) { bool HDF5Reader::execute(const std::string& name, std::vector<std::string>& value) { std::string full_name = get_path() + "/" + name; if (!exists(full_name)) { return false; Loading src/io/hdf5/hdf5_writer.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -118,7 +118,7 @@ void HDF5Writer::write(const std::string& name, const std::vector<hsize_t>& dims dataspace.getSimpleExtentDims(size_check_.data(), nullptr); if (size_check_ != dims) { throw(std::out_of_range("Object size different than HDF5 dataset.")); throw(std::length_error("Object size different than HDF5 dataset.")); } dataset.write(data, type, dataspace, H5P_DEFAULT); Loading test/unit/io/hdf5_reader_writer_test.cpp +24 −1 Original line number Diff line number Diff line Loading @@ -120,6 +120,29 @@ TEST(HDF5ReaderWriterTest, VectorOfVectorsReadWrite) { } } TEST(HDF5ReaderWriterTest, VectorOfArraysReadWrite) { const std::string object_name = "obj"; const std::string file_name = "test.hdf5"; std::vector<std::array<int, 3>> data{{-1, 2, 3}, {5, -7, 0}}; // Create test file. dca::io::HDF5Writer writer; writer.open_file(file_name); writer.execute(object_name, data); writer.close_file(); // Read test file. dca::io::HDF5Reader reader; std::vector<std::array<int, 3>> data_read; reader.open_file(file_name); EXPECT_TRUE(reader.execute(object_name, data_read)); EXPECT_EQ(data, data_read); reader.close_file(); } TEST(HDF5ReaderWriterTest, VectorOfStringsReadWrite) { std::vector<std::string> s1{"foo", "bar", "baz"}; Loading Loading @@ -283,7 +306,7 @@ TEST(HDF5ReaderWriterTest, Overwrite) { writer.execute("a", 2); // Try to write with different size. EXPECT_THROW(writer.execute("a", std::pair<int, int>(1, 1)), std::out_of_range); EXPECT_THROW(writer.execute("a", std::pair<int, int>(1, 1)), std::length_error); writer.close_file(); Loading Loading
include/dca/io/hdf5/hdf5_reader.hpp +45 −21 Original line number Diff line number Diff line Loading @@ -63,20 +63,23 @@ public: // `execute` returns true if the object is read correctly. template <typename scalartype> bool execute(std::string name, scalartype& value); bool execute(const std::string& name, scalartype& value); template <typename Scalar> bool execute(std::string name, std::vector<Scalar>& value); bool execute(const std::string& name, std::vector<Scalar>& value); template <typename Scalar> bool execute(std::string name, std::vector<std::complex<Scalar>>& value); bool execute(const std::string& name, std::vector<std::complex<Scalar>>& value); template <typename Scalar> bool execute(std::string name, std::vector<std::vector<Scalar>>& value); bool execute(const std::string& name, std::vector<std::vector<Scalar>>& value); bool execute(std::string name, std::string& value); template <typename Scalar, std::size_t n> bool execute(const std::string& name, std::vector<std::array<Scalar, n>>& value); bool execute(std::string name, std::vector<std::string>& value); bool execute(const std::string& name, std::string& value); bool execute(const std::string& name, std::vector<std::string>& value); // TODO: Remove? (only thing that depends on domains.hpp) template <typename domain_type> Loading @@ -88,24 +91,26 @@ public: bool execute(func::function<scalartype, domain_type>& f); template <typename scalartype, typename domain_type> bool execute(std::string name, func::function<scalartype, domain_type>& f); bool execute(const std::string& name, func::function<scalartype, domain_type>& f); template <typename Scalar> bool execute(std::string name, dca::linalg::Vector<Scalar, dca::linalg::CPU>& A); bool execute(const std::string& name, dca::linalg::Vector<Scalar, dca::linalg::CPU>& A); template <typename Scalar> bool execute(std::string name, dca::linalg::Vector<std::complex<Scalar>, dca::linalg::CPU>& A); bool execute(const std::string& name, dca::linalg::Vector<std::complex<Scalar>, dca::linalg::CPU>& A); template <typename Scalar> bool execute(std::string name, dca::linalg::Matrix<Scalar, dca::linalg::CPU>& A); bool execute(const std::string& name, dca::linalg::Matrix<Scalar, dca::linalg::CPU>& A); template <typename Scalar> bool execute(std::string name, dca::linalg::Matrix<std::complex<Scalar>, dca::linalg::CPU>& A); bool execute(const std::string& name, dca::linalg::Matrix<std::complex<Scalar>, dca::linalg::CPU>& A); template <typename Scalar> bool execute(dca::linalg::Matrix<Scalar, dca::linalg::CPU>& A); bool execute(std::string name, io::Buffer& buff) { bool execute(const std::string& name, io::Buffer& buff) { return execute(name, static_cast<io::Buffer::Container&>(buff)); } Loading @@ -130,7 +135,7 @@ void HDF5Reader::from_file(arbitrary_struct_t& arbitrary_struct, std::string fil } template <typename Scalar> bool HDF5Reader::execute(std::string name, Scalar& value) { bool HDF5Reader::execute(const std::string& name, Scalar& value) { std::string full_name = get_path() + "/" + name; if (!exists(full_name)) { Loading @@ -142,7 +147,7 @@ bool HDF5Reader::execute(std::string name, Scalar& value) { } template <typename Scalar> bool HDF5Reader::execute(std::string name, std::vector<Scalar>& value) { bool HDF5Reader::execute(const std::string& name, std::vector<Scalar>& value) { std::string full_name = get_path() + "/" + name; if (!exists(full_name)) { Loading @@ -158,7 +163,7 @@ bool HDF5Reader::execute(std::string name, std::vector<Scalar>& value) { } template <typename Scalar> bool HDF5Reader::execute(std::string name, std::vector<std::complex<Scalar>>& value) { bool HDF5Reader::execute(const std::string& name, std::vector<std::complex<Scalar>>& value) { std::string full_name = get_path() + "/" + name; if (!exists(full_name)) { Loading @@ -174,7 +179,7 @@ bool HDF5Reader::execute(std::string name, std::vector<std::complex<Scalar>>& va } template <typename Scalar> bool HDF5Reader::execute(std::string name, std::vector<std::vector<Scalar>>& value) { bool HDF5Reader::execute(const std::string& name, std::vector<std::vector<Scalar>>& value) { std::string full_name = get_path() + "/" + name; if (!exists(full_name)) { return false; Loading Loading @@ -215,13 +220,32 @@ bool HDF5Reader::execute(std::string name, std::vector<std::vector<Scalar>>& val return true; } template <typename Scalar, std::size_t n> bool HDF5Reader::execute(const std::string& name, std::vector<std::array<Scalar, n>>& value) { std::string full_name = get_path() + "/" + name; if (!exists(full_name)) { return false; } auto dims = readSize(full_name); assert(dims.size() == 2); if (dims.at(1) != n) { throw(std::length_error("Wrong array size")); } value.resize(dims[0]); read(full_name, HDF5_TYPE<Scalar>::get_PredType(), value.data()); return true; } template <typename scalartype, typename domain_type> bool HDF5Reader::execute(func::function<scalartype, domain_type>& f) { return execute(f.get_name(), f); } template <typename scalartype, typename domain_type> bool HDF5Reader::execute(std::string name, func::function<scalartype, domain_type>& f) { bool HDF5Reader::execute(const std::string& name, func::function<scalartype, domain_type>& f) { std::string full_name = get_path() + "/" + name; if (!exists(full_name)) { Loading @@ -238,7 +262,7 @@ bool HDF5Reader::execute(std::string name, func::function<scalartype, domain_typ } template <typename Scalar> bool HDF5Reader::execute(std::string name, dca::linalg::Vector<Scalar, dca::linalg::CPU>& V) { bool HDF5Reader::execute(const std::string& name, dca::linalg::Vector<Scalar, dca::linalg::CPU>& V) { std::string full_name = get_path() + "/" + name; if (!exists(full_name)) { return false; Loading @@ -254,7 +278,7 @@ bool HDF5Reader::execute(std::string name, dca::linalg::Vector<Scalar, dca::lina } template <typename Scalar> bool HDF5Reader::execute(std::string name, bool HDF5Reader::execute(const std::string& name, dca::linalg::Vector<std::complex<Scalar>, dca::linalg::CPU>& V) { std::string full_name = get_path() + "/" + name; if (!exists(full_name)) { Loading @@ -271,7 +295,7 @@ bool HDF5Reader::execute(std::string name, } template <typename Scalar> bool HDF5Reader::execute(std::string name, dca::linalg::Matrix<Scalar, dca::linalg::CPU>& A) { bool HDF5Reader::execute(const std::string& name, dca::linalg::Matrix<Scalar, dca::linalg::CPU>& A) { std::string full_name = get_path() + "/" + name; if (!exists(full_name)) { return false; Loading @@ -296,7 +320,7 @@ bool HDF5Reader::execute(std::string name, dca::linalg::Matrix<Scalar, dca::lina } template <typename Scalar> bool HDF5Reader::execute(std::string name, bool HDF5Reader::execute(const std::string& name, dca::linalg::Matrix<std::complex<Scalar>, dca::linalg::CPU>& A) { std::string full_name = get_path() + "/" + name; if (!exists(full_name)) { Loading
include/dca/io/hdf5/hdf5_writer.hpp +1 −1 Original line number Diff line number Diff line Loading @@ -257,7 +257,7 @@ void HDF5Writer::execute(const std::string& name, const std::vector<std::array<S if (value.size() == 0) return; std::array<hsize_t, 2> dims{value.size(), n}; std::vector<hsize_t> dims{value.size(), n}; std::string full_name = get_path() + "/" + name; write(full_name, dims, HDF5_TYPE<Scalar>::get_PredType(), value.data()); Loading
src/io/hdf5/hdf5_reader.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -57,7 +57,7 @@ std::string HDF5Reader::get_path() { return path; } bool HDF5Reader::execute(std::string name, std::string& value) { bool HDF5Reader::execute(const std::string& name, std::string& value) { std::string full_name = get_path() + "/" + name; if (!exists(full_name)) { Loading @@ -72,7 +72,7 @@ bool HDF5Reader::execute(std::string name, std::string& value) { return true; } bool HDF5Reader::execute(std::string name, std::vector<std::string>& value) { bool HDF5Reader::execute(const std::string& name, std::vector<std::string>& value) { std::string full_name = get_path() + "/" + name; if (!exists(full_name)) { return false; Loading
src/io/hdf5/hdf5_writer.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -118,7 +118,7 @@ void HDF5Writer::write(const std::string& name, const std::vector<hsize_t>& dims dataspace.getSimpleExtentDims(size_check_.data(), nullptr); if (size_check_ != dims) { throw(std::out_of_range("Object size different than HDF5 dataset.")); throw(std::length_error("Object size different than HDF5 dataset.")); } dataset.write(data, type, dataspace, H5P_DEFAULT); Loading
test/unit/io/hdf5_reader_writer_test.cpp +24 −1 Original line number Diff line number Diff line Loading @@ -120,6 +120,29 @@ TEST(HDF5ReaderWriterTest, VectorOfVectorsReadWrite) { } } TEST(HDF5ReaderWriterTest, VectorOfArraysReadWrite) { const std::string object_name = "obj"; const std::string file_name = "test.hdf5"; std::vector<std::array<int, 3>> data{{-1, 2, 3}, {5, -7, 0}}; // Create test file. dca::io::HDF5Writer writer; writer.open_file(file_name); writer.execute(object_name, data); writer.close_file(); // Read test file. dca::io::HDF5Reader reader; std::vector<std::array<int, 3>> data_read; reader.open_file(file_name); EXPECT_TRUE(reader.execute(object_name, data_read)); EXPECT_EQ(data, data_read); reader.close_file(); } TEST(HDF5ReaderWriterTest, VectorOfStringsReadWrite) { std::vector<std::string> s1{"foo", "bar", "baz"}; Loading Loading @@ -283,7 +306,7 @@ TEST(HDF5ReaderWriterTest, Overwrite) { writer.execute("a", 2); // Try to write with different size. EXPECT_THROW(writer.execute("a", std::pair<int, int>(1, 1)), std::out_of_range); EXPECT_THROW(writer.execute("a", std::pair<int, int>(1, 1)), std::length_error); writer.close_file(); Loading