Create coordinate mapping information for container.
276{
277 if (!container) {
278 throw std::invalid_argument("Container is null");
279 }
280
281 std::unordered_map<std::string, std::any> mapping_info;
282 const auto dimensions = container->get_dimensions();
283
284 std::vector<std::unordered_map<std::string, std::any>> dim_mappings;
285 dim_mappings.reserve(dimensions.size());
286
287 for (size_t i = 0; i < dimensions.size(); ++i) {
288 std::unordered_map<std::string, std::any> dim_map;
289 dim_map["index"] = i;
290 dim_map["name"] = dimensions[i].name;
291 dim_map["size"] = dimensions[i].size;
292 dim_map["stride"] = dimensions[i].stride;
293 dim_map["role"] = static_cast<int>(dimensions[i].role);
294
295 uint64_t offset = (i == 0) ? 0ULL :
std::accumulate(dimensions.begin(), dimensions.begin() + i, 1ULL, [](uint64_t acc, const auto& d) {
return acc * d.size; });
296 dim_map["offset"] = offset;
297
298 dim_mappings.push_back(std::move(dim_map));
299 }
300
301 mapping_info["dimensions"] = std::move(dim_mappings);
302 mapping_info["total_elements"] = container->get_total_elements();
303 mapping_info["memory_layout"] = static_cast<int>(container->get_memory_layout());
304
306 mapping_info["calculated_strides"] = strides;
307
308 return mapping_info;
309}
std::vector< uint64_t > calculate_strides(const std::vector< DataDimension > &dimensions)
Calculate memory strides for each dimension (row-major order).