4#include "base64_rfc4648.hpp"
15 bool processPath(std::vector<std::string> &pth)
17 bool ifAbs = pth.empty() || pth[0].empty();
19 std::remove_if(pth.begin(), pth.end(), [](
const std::string &
v)
20 { return v.empty(); }),
26 std::string constructPath(std::vector<std::string> &pth)
29 for (
auto &name : pth)
30 ret.append(std::string(
"/") + name);
39 fileStream.open(fName, std::ios::in);
41 fileStream.open(fName, std::ios::out);
42 DNDS_assert_info(fileStream.is_open(), fmt::format(
" attempted to {} file [{}]", read ?
"read" :
"write", fName));
55 if (!reading &&
bool(fileStream))
67 bool isAbs = processPath(pth);
69 jObj[nlohmann::json::json_pointer(constructPath(pth))] = nlohmann::json::object();
71 jObj[nlohmann::json::json_pointer(cP + constructPath(pth))] = nlohmann::json::object();
76 bool isAbs = processPath(pth);
78 cPathSplit = std::move(pth);
80 for (
auto &name : pth)
81 cPathSplit.push_back(name);
82 cP = constructPath(cPathSplit);
83 DNDS_assert(jObj[nlohmann::json::json_pointer(cP)].is_object());
92 auto cPointer = nlohmann::json::json_pointer(cP);
93 auto v = jObj[cPointer];
94 DNDS_assert_info(
v.is_object(), fmt::format(
"current path is not an object " + cP));
95 std::set<std::string> ret;
96 for (
auto &[key, value] :
v.items())
103 auto cPointer = nlohmann::json::json_pointer(cP);
104 jObj[cPointer][name] =
v;
108 auto cPointer = nlohmann::json::json_pointer(cP);
109 jObj[cPointer][name] =
v;
113 auto cPointer = nlohmann::json::json_pointer(cP);
114 jObj[cPointer][name] =
v;
118 auto cPointer = nlohmann::json::json_pointer(cP);
119 jObj[cPointer][name] =
v;
123 auto cPointer = nlohmann::json::json_pointer(cP);
124 jObj[cPointer][name] =
v;
128 auto cPointer = nlohmann::json::json_pointer(cP);
129 jObj[cPointer][name] =
v;
133 auto cPointer = nlohmann::json::json_pointer(cP);
134 jObj[cPointer][name] =
v;
138 auto cPointer = nlohmann::json::json_pointer(cP);
141 jObj[cPointer][name][
"ref"] = refPath;
144 jObj[cPointer][name] = *
v;
150 auto cPointer = nlohmann::json::json_pointer(cP);
153 jObj[cPointer][name][
"ref"] = refPath;
156 jObj[cPointer][name] = *
v;
163 auto cPointer = nlohmann::json::json_pointer(cP);
164 DNDS_assert(jObj[cPointer][name].is_number_integer());
165 v = jObj[cPointer][name].get<std::remove_reference_t<
decltype(
v)>>();
169 auto cPointer = nlohmann::json::json_pointer(cP);
170 DNDS_assert(jObj[cPointer][name].is_number_integer());
171 v = jObj[cPointer][name].get<std::remove_reference_t<
decltype(
v)>>();
175 auto cPointer = nlohmann::json::json_pointer(cP);
176 DNDS_assert(jObj[cPointer][name].is_number_float());
177 v = jObj[cPointer][name].get<std::remove_reference_t<
decltype(
v)>>();
181 auto cPointer = nlohmann::json::json_pointer(cP);
183 v = jObj[cPointer][name].get<std::remove_reference_t<
decltype(
v)>>();
184 offset = ArrayGlobalOffset_Unknown;
188 auto cPointer = nlohmann::json::json_pointer(cP);
190 v = jObj[nlohmann::json::json_pointer(cP)][name].get<std::remove_reference_t<
decltype(
v)>>();
191 offset = ArrayGlobalOffset_Unknown;
195 auto cPointer = nlohmann::json::json_pointer(cP);
197 v = jObj[cPointer][name].get<std::remove_reference_t<
decltype(
v)>>();
198 offset = ArrayGlobalOffset_Unknown;
202 auto cPointer = nlohmann::json::json_pointer(cP);
204 v = jObj[cPointer][name].get<std::remove_reference_t<
decltype(
v)>>();
208 auto cPointer = nlohmann::json::json_pointer(cP);
211 if (jObj[cPointer][name].is_object() && !jObj[cPointer][name].is_array())
213 DNDS_assert(jObj[cPointer][name][
"ref"].is_string());
214 refPath = jObj[cPointer][name][
"ref"].get<std::string>();
218 refPath = cP +
"/" + name;
227 DNDS_assert(jObj[nlohmann::json::json_pointer(refPath)].is_array());
229 auto v_temp = jObj[nlohmann::json::json_pointer(refPath)].get<std::vector<index>>();
230 v = std::make_shared<tValue>(v_temp);
233 offset = ArrayGlobalOffset_Unknown;
237 auto cPointer = nlohmann::json::json_pointer(cP);
240 if (jObj[cPointer][name].is_object() && !jObj[cPointer][name].is_array())
242 DNDS_assert(jObj[cPointer][name][
"ref"].is_string());
243 refPath = jObj[cPointer][name][
"ref"].get<std::string>();
247 refPath = cP +
"/" + name;
256 DNDS_assert(jObj[nlohmann::json::json_pointer(refPath)].is_array());
258 auto v_temp = jObj[nlohmann::json::json_pointer(refPath)].get<std::vector<rowsize>>();
259 v = std::make_shared<tValue>(v_temp);
262 offset = ArrayGlobalOffset_Unknown;
266 auto zlibCompressedSize = [&](
index sizeC)
268 return sizeC + (sizeC + 999) / 1000 + 12;
270 int compressLevel = this->deflateLevel;
271 auto zlibCompressData = [&](
const uint8_t *buf,
index sizeC)
273 std::vector<uint8_t> ret(zlibCompressedSize(sizeC));
274 uLongf retSize = ret.size();
275 auto ret_v = compress2(ret.data(), &retSize, buf, sizeC, compressLevel);
282 auto cPointer = nlohmann::json::json_pointer(cP);
283 if (!useCodecOnUint8)
284 jObj[cPointer][name] = std::vector<uint8_t>(data, data + size);
287 jObj[cPointer][name][
"size"] = size;
288 jObj[cPointer][name][
"encoded"] = cppcodec::base64_rfc4648::encode(
289 zlibCompressData(data, size));
294 auto cPointer = nlohmann::json::json_pointer(cP);
295 DNDS_assert(jObj[cPointer][name].is_object() || jObj[cPointer][name].is_array());
296 if (jObj[cPointer][name].is_array())
298 size = jObj[cPointer][name].size();
300 std::copy(jObj[cPointer][name].begin(), jObj[cPointer][name].end(), data);
302 else if (jObj[cPointer][name].is_object() &&
303 jObj[cPointer][name][
"size"].is_number_integer() &&
304 jObj[cPointer][name][
"encoded"].is_string())
306 size = jObj[cPointer][name][
"size"];
307 auto &dataIn = jObj[cPointer][name][
"encoded"].get_ref<nlohmann::json::string_t &>();
310 std::vector<uint8_t> decodedData;
311 cppcodec::base64_rfc4648::decode(decodedData, dataIn);
312 std::vector<uint8_t> decodedDataUncompress(size);
313 uLongf sizeU{(uLongf)size};
314 auto ret = uncompress(decodedDataUncompress.data(), &sizeU, decodedData.data(), decodedData.size());
318 std::copy(decodedDataUncompress.begin(), decodedDataUncompress.end(), data);
325 offset = ArrayGlobalOffset_Unknown;
#define DNDS_assert_info(expr, info)
Debug-only assertion with an extra std::string info message.
#define DNDS_assert(expr)
Debug-only assertion (compiled out when DNDS_NDEBUG is defined). Prints the expression + file/line + ...
Per-rank JSON serializer implementing the SerializerBase interface.
Describes one rank's window into a globally-distributed dataset.
void dedupRegister(const ssp< T > &v, const std::string &path)
Register a shared pointer after writing its data.
bool dedupLookup(const ssp< T > &v, std::string &outPath)
Check if a shared pointer was already written; if so return its path.
std::map< std::string, void * > pth_2_ssp
Reverse map for read-side dedup: path -> raw pointer to the ssp local variable.
void dedupClear()
Clear all dedup state (call on CloseFile).
void CloseFileNonVirtual()
void ReadIndexVector(const std::string &name, std::vector< index > &v, ArrayGlobalOffset &offset) override
void ReadSharedIndexVector(const std::string &name, ssp< host_device_vector< index > > &v, ArrayGlobalOffset &offset) override
void ReadString(const std::string &name, std::string &v) override
Read a UTF-8 string into v.
void ReadRealVector(const std::string &name, std::vector< real > &v, ArrayGlobalOffset &offset) override
std::set< std::string > ListCurrentPath() override
Names of direct children of the current path.
std::string GetCurrentPath() override
String form of the current path.
void CloseFile() override
Close the backing file, flushing buffers.
void WriteSharedRowsizeVector(const std::string &name, const ssp< host_device_vector< rowsize > > &v, ArrayGlobalOffset offset) override
Write a shared rowsize vector; deduplicated across multiple writes.
void WriteString(const std::string &name, const std::string &v) override
Write a UTF-8 string under name.
void OpenFile(const std::string &fName, bool read) override
Open a backing file (H5 file or JSON file depending on subclass).
void WriteSharedIndexVector(const std::string &name, const ssp< host_device_vector< index > > &v, ArrayGlobalOffset offset) override
Write a shared index vector; deduplicated across multiple writes that share the same shared_ptr.
void ReadInt(const std::string &name, int &v) override
Read a scalar int into v.
void ReadUint8Array(const std::string &name, uint8_t *data, index &size, ArrayGlobalOffset &offset) override
Two-pass byte array read.
void CreatePath(const std::string &p) override
Create a sub-path (H5 group / JSON object) at the current location.
void WriteRowsizeVector(const std::string &name, const std::vector< rowsize > &v, ArrayGlobalOffset offset) override
Write a rowsize vector (collective for H5).
void WriteInt(const std::string &name, int v) override
Write a scalar int under name at the current path.
void WriteIndexVector(const std::string &name, const std::vector< index > &v, ArrayGlobalOffset offset) override
Write an index vector (collective for H5). offset carries the distribution mode (ArrayGlobalOffset_Pa...
void WriteUint8Array(const std::string &name, const uint8_t *data, index size, ArrayGlobalOffset offset) override
Write a raw byte buffer under name. offset.isDist() = true means the caller provides the exact per-ra...
void ReadSharedRowsizeVector(const std::string &name, ssp< host_device_vector< rowsize > > &v, ArrayGlobalOffset &offset) override
void ReadIndex(const std::string &name, index &v) override
Read a scalar index into v.
void WriteRealVector(const std::string &name, const std::vector< real > &v, ArrayGlobalOffset offset) override
Write a real vector (collective for H5).
void WriteReal(const std::string &name, real v) override
Write a scalar real under name.
void ReadRowsizeVector(const std::string &name, std::vector< rowsize > &v, ArrayGlobalOffset &offset) override
void WriteIndex(const std::string &name, index v) override
Write a scalar index under name.
void GoToPath(const std::string &p) override
Navigate to an existing path. Supports / -separated segments.
void ReadReal(const std::string &name, real &v) override
Read a scalar real into v.
Host + optional device vector of trivially copyable T.
std::vector< std::string > splitSString(const std::string &str, char delim)
int64_t index
Global row / DOF index type (signed 64-bit; handles multi-billion-cell meshes).
std::shared_ptr< T > ssp
Shortened alias for std::shared_ptr used pervasively in DNDSR.
double real
Canonical floating-point scalar used throughout DNDSR (double precision).
Eigen::Matrix< real, 5, 1 > v