Commit f45dca65 authored by gbalduzz's avatar gbalduzz
Browse files

fixed and tested vector of arrays.

parent 46bc404f
Loading
Loading
Loading
Loading
+45 −21
Original line number Diff line number Diff line
@@ -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>
@@ -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));
  }

@@ -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)) {
@@ -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)) {
@@ -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)) {
@@ -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;
@@ -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)) {
@@ -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;
@@ -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)) {
@@ -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;
@@ -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)) {
+1 −1
Original line number Diff line number Diff line
@@ -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());
+2 −2
Original line number Diff line number Diff line
@@ -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)) {
@@ -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;
+1 −1
Original line number Diff line number Diff line
@@ -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);
+24 −1
Original line number Diff line number Diff line
@@ -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"};

@@ -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();