Skip to content
Snippets Groups Projects
Commit c4079cae authored by Michael Buehlmann's avatar Michael Buehlmann
Browse files

add some safe-guards for the python genericio reader

throw an error for missing variables and multiple-defined
 variables if variables are passed to the reader interface

explicitly define the stride for numpy arrays
parent 5ef73c6c
No related branches found
No related tags found
No related merge requests found
Pipeline #6170 failed
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <map> #include <map>
#include <cstdint> #include <cstdint>
#include <optional> #include <optional>
#include <stdexcept>
#ifndef GENERICIO_NO_MPI #ifndef GENERICIO_NO_MPI
#include <mpi.h> #include <mpi.h>
...@@ -119,6 +120,10 @@ public: ...@@ -119,6 +120,10 @@ public:
std::map<std::string, py::array> result; std::map<std::string, py::array> result;
for(const std::string& var_name: *var_names) { for(const std::string& var_name: *var_names) {
// check if it's not already defined (caused some segfaults at some point)
if(result.count(var_name)) {
throw std::invalid_argument(std::string("variable name was passed multiple times: ") + var_name);
}
auto varp = std::find_if( auto varp = std::find_if(
variables.begin(), variables.begin(),
variables.end(), variables.end(),
...@@ -127,24 +132,28 @@ public: ...@@ -127,24 +132,28 @@ public:
if (varp != variables.end()) { if (varp != variables.end()) {
// extra space // extra space
py::ssize_t readsize = num_elem + requestedExtraSpace()/(*varp).ElementSize; py::ssize_t readsize = num_elem + requestedExtraSpace()/(*varp).ElementSize;
// py::array_t constructor: (shape, stride) -> some compilers or numpy
// versions require stride to be explicitly specified
if((*varp).IsFloat && (*varp).ElementSize == 4) { if((*varp).IsFloat && (*varp).ElementSize == 4) {
result[var_name] = py::array_t<float>(readsize); result[var_name] = py::array_t<float>({readsize}, {4});
addVariable(*varp, result[var_name].mutable_data(), gio::GenericIO::VarHasExtraSpace); addVariable(*varp, result[var_name].mutable_data(), gio::GenericIO::VarHasExtraSpace);
} else if((*varp).IsFloat && (*varp).ElementSize == 8) { } else if((*varp).IsFloat && (*varp).ElementSize == 8) {
result[var_name] = py::array_t<double>(readsize); result[var_name] = py::array_t<double>({readsize}, {8});
addVariable(*varp, result[var_name].mutable_data(), gio::GenericIO::VarHasExtraSpace); addVariable(*varp, result[var_name].mutable_data(), gio::GenericIO::VarHasExtraSpace);
} else if(!(*varp).IsFloat && (*varp).ElementSize == 4) { } else if(!(*varp).IsFloat && (*varp).ElementSize == 4) {
result[var_name] = py::array_t<int32_t>(readsize); result[var_name] = py::array_t<int32_t>({readsize}, {4});
addVariable(*varp, result[var_name].mutable_data(), gio::GenericIO::VarHasExtraSpace); addVariable(*varp, result[var_name].mutable_data(), gio::GenericIO::VarHasExtraSpace);
} else if(!(*varp).IsFloat && (*varp).ElementSize == 8) { } else if(!(*varp).IsFloat && (*varp).ElementSize == 8) {
result[var_name] = py::array_t<int64_t>(readsize); result[var_name] = py::array_t<int64_t>({readsize}, {8});
addVariable(*varp, result[var_name].mutable_data(), gio::GenericIO::VarHasExtraSpace); addVariable(*varp, result[var_name].mutable_data(), gio::GenericIO::VarHasExtraSpace);
} else if(!(*varp).IsFloat && (*varp).ElementSize == 2) { } else if(!(*varp).IsFloat && (*varp).ElementSize == 2) {
result[var_name] = py::array_t<uint16_t>(readsize); result[var_name] = py::array_t<uint16_t>({readsize}, {2});
addVariable(*varp, result[var_name].mutable_data(), gio::GenericIO::VarHasExtraSpace); addVariable(*varp, result[var_name].mutable_data(), gio::GenericIO::VarHasExtraSpace);
} else { } else {
throw std::runtime_error(std::string("Unknown data type in GenericIO for variable ") + var_name); throw std::runtime_error(std::string("unknown data type in GenericIO for variable: ") + var_name);
} }
} else { // variable not found
throw std::invalid_argument(std::string("requested variable is not defined in GenericIO file: ") + var_name);
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment