diff --git a/CHANGELOG.md b/CHANGELOG.md index 10b05c4..51f1976 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## v1.5.1 - 29-11-2024 + +### Fixed + +- Set precision in `DTensor::saveToFile` properly +- `DTensor::parseFromTextFile` throws `std::invalid_argument` if `T` is unsupported + diff --git a/include/tensor.cuh b/include/tensor.cuh index 6da01a5..1d1534d 100644 --- a/include/tensor.cuh +++ b/include/tensor.cuh @@ -629,8 +629,9 @@ data_t vectorFromFile(std::string path_to_file) { vecDataFromFile[i] = std::stoull(line.c_str()); } else if constexpr (std::is_same_v) { sscanf(line.c_str(), "%zu", &vecDataFromFile[i]); + } else { + throw std::invalid_argument("data type not supported"); } - // todo if (++i == numElements) break; } @@ -653,8 +654,7 @@ void DTensor::saveToFile(std::string pathToFile) { file << numRows() << std::endl << numCols() << std::endl << numMats() << std::endl; std::vector myData(numEl()); download(myData); if constexpr (std::is_floating_point::value) { - int prec = std::numeric_limits::max_digits10 - 1; - file << std::setprecision(prec); + file << std::setprecision(std::numeric_limits::max_digits10); } for(const T& el : myData) file << el << std::endl; } diff --git a/test/testTensor.cu b/test/testTensor.cu index 2d97df7..64dfc57 100644 --- a/test/testTensor.cu +++ b/test/testTensor.cu @@ -122,17 +122,20 @@ TEST_F(TensorTest, randomTensorCreation) { TEMPLATE_WITH_TYPE_T void parseTensorFromFile() { - size_t nR = 20, nC = 40, nM = 60; - auto r = DTensor::createRandomTensor(nR, nC, nM, -1, 1); - std::string fName = "myTest.dtensor"; - r.saveToFile(fName); - auto a = DTensor::parseFromTextFile(fName); - EXPECT_EQ(nR, a.numRows()); - EXPECT_EQ(nC, a.numCols()); - EXPECT_EQ(nM, a.numMats()); - auto diff = a - r; - T err = diff.maxAbs(); - EXPECT_LT(err, 2*std::numeric_limits::epsilon()); + size_t n_runs = 10; + for (size_t i = 0; i < n_runs; i++) { + size_t nR = 20, nC = 40, nM = 6; + auto r = DTensor::createRandomTensor(nR, nC, nM, -1, 1); + std::string fName = "myTest.dtensor"; + r.saveToFile(fName); + auto a = DTensor::parseFromTextFile(fName); + EXPECT_EQ(nR, a.numRows()); + EXPECT_EQ(nC, a.numCols()); + EXPECT_EQ(nM, a.numMats()); + auto diff = a - r; + T err = diff.maxAbs(); + EXPECT_LT(err, 2 * std::numeric_limits::epsilon()); + } } TEST_F(TensorTest, parseTensorFromFile) { @@ -140,6 +143,14 @@ TEST_F(TensorTest, parseTensorFromFile) { parseTensorFromFile(); } +TEST_F(TensorTest, parseTensorUnsupportedDataType) { + size_t nR = 20, nC = 40, nM = 60; + auto r = DTensor::createRandomTensor(nR, nC, nM, -1, 1); + std::string fName = "myTest.dtensor"; + r.saveToFile(fName); + EXPECT_THROW(DTensor::parseFromTextFile(fName), std::invalid_argument); +} + /* --------------------------------------- * Move constructor * --------------------------------------- */