MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ detect_data_dimensions() [2/3]

std::vector< DataDimension > MayaFlux::Kakshya::detect_data_dimensions ( const std::vector< DataVariant > &  variants)

Definition at line 255 of file DataUtils.cpp.

257{
258 std::cerr << "Inferring structure from DataVariant vector...\n"
259 << "This is not advisable as the method makes naive assumptions that can lead to massive computational errors\n"
260 << "If the variant is part of a container, region, or segment, please use the appropriate method instead.\n"
261 << "If you are sure you want to proceed, please ignore this warning.\n";
262
263 if (variants.empty()) {
264 std::vector<DataDimension> dims;
265 dims.emplace_back("empty_variants", 0, 1, DataDimension::Role::CUSTOM);
266 return dims;
267 }
268
269 std::vector<DataDimension> dimensions;
270 size_t variant_count = variants.size();
271
272 size_t first_variant_size = std::visit([](const auto& vec) -> size_t {
273 return vec.size();
274 },
275 variants[0]);
276
277 bool consistent_glm = std::ranges::all_of(variants, [](const auto& variant) {
278 return std::visit([](const auto& vec) -> bool {
279 using ValueType = typename std::decay_t<decltype(vec)>::value_type;
280 return GlmData<ValueType>;
281 },
282 variant);
283 });
284
285 bool consistent_decimal = std::ranges::all_of(variants, [](const auto& variant) {
286 return std::visit([](const auto& vec) -> bool {
287 using ValueType = typename std::decay_t<decltype(vec)>::value_type;
288 return MayaFlux::DecimalData<ValueType>;
289 },
290 variant);
291 });
292
293 bool consistent_complex = std::ranges::all_of(variants, [](const auto& variant) {
294 return std::visit([](const auto& vec) -> bool {
295 using ValueType = typename std::decay_t<decltype(vec)>::value_type;
296 return MayaFlux::ComplexData<ValueType>;
297 },
298 variant);
299 });
300
301 bool consistent_integer = std::ranges::all_of(variants, [](const auto& variant) {
302 return std::visit([](const auto& vec) -> bool {
303 using ValueType = typename std::decay_t<decltype(vec)>::value_type;
304 return MayaFlux::IntegerData<ValueType>;
305 },
306 variant);
307 });
308
309 if (consistent_glm) {
310 dimensions.emplace_back(DataDimension::channel(variant_count));
311
312 std::visit([&](const auto& first_vec) {
313 using ValueType = typename std::decay_t<decltype(first_vec)>::value_type;
314 constexpr size_t components = glm_component_count<ValueType>();
315
316 DataDimension::Role role = DataDimension::Role::CUSTOM;
317 if constexpr (GlmVec2Type<ValueType>) {
318 role = DataDimension::Role::UV;
319 } else if constexpr (GlmVec3Type<ValueType>) {
320 role = DataDimension::Role::POSITION;
321 } else if constexpr (GlmVec4Type<ValueType>) {
322 role = DataDimension::Role::COLOR;
323 }
324
325 dimensions.emplace_back(DataDimension::grouped(
326 "glm_elements",
327 first_variant_size,
328 static_cast<uint8_t>(components),
329 role));
330 },
331 variants[0]);
332
333 return dimensions;
334 }
335
336 if (variant_count == 1) {
337 if (consistent_decimal) {
338 dimensions.emplace_back(DataDimension::time(first_variant_size, "samples"));
339 } else if (consistent_complex) {
340 dimensions.emplace_back(DataDimension::frequency(first_variant_size, "frequency_data"));
341 } else if (consistent_integer) {
342 dimensions.emplace_back(DataDimension::spatial(first_variant_size, 'x', 1, "data_points"));
343 } else {
344 dimensions.emplace_back("unknown_data", first_variant_size, 1,
345 DataDimension::Role::CUSTOM);
346 }
347
348 } else if (variant_count == 2 && (consistent_decimal || consistent_complex || consistent_integer)) {
349 dimensions.emplace_back(DataDimension::channel(2));
350 if (consistent_decimal) {
351 dimensions.emplace_back(DataDimension::time(first_variant_size, "samples"));
352 } else if (consistent_complex) {
353 dimensions.emplace_back(DataDimension::frequency(first_variant_size, "bins"));
354 } else {
355 dimensions.emplace_back(DataDimension::spatial(first_variant_size, 'x', 1, "elements"));
356 }
357
358 } else if (variant_count <= 16 && (consistent_decimal || consistent_complex || consistent_integer)) {
359 dimensions.emplace_back(DataDimension::channel(variant_count));
360 if (consistent_decimal) {
361 dimensions.emplace_back(DataDimension::time(first_variant_size, "samples"));
362 } else if (consistent_complex) {
363 dimensions.emplace_back(DataDimension::frequency(first_variant_size, "bins"));
364 } else {
365 dimensions.emplace_back(DataDimension::spatial(first_variant_size, 'x', 1, "pixels"));
366 }
367
368 } else if (consistent_decimal || consistent_complex || consistent_integer) {
369 if (consistent_decimal) {
370 dimensions.emplace_back(DataDimension::time(variant_count, "time_blocks"));
371 dimensions.emplace_back("block_samples", first_variant_size, 1,
372 DataDimension::Role::CUSTOM);
373 } else if (consistent_complex) {
374 dimensions.emplace_back(DataDimension::time(variant_count, "time_windows"));
375 dimensions.emplace_back(DataDimension::frequency(first_variant_size, "frequency_bins"));
376 } else {
377 dimensions.emplace_back(DataDimension::time(variant_count, "frames"));
378 dimensions.emplace_back(DataDimension::spatial(first_variant_size, 'x', 1, "frame_data"));
379 }
380
381 } else {
382 dimensions.emplace_back("mixed_variants", variant_count, 1,
383 DataDimension::Role::CUSTOM);
384 dimensions.emplace_back("variant_data", first_variant_size, 1,
385 DataDimension::Role::CUSTOM);
386 }
387
388 return dimensions;
389}

References MayaFlux::Kakshya::DataDimension::channel(), MayaFlux::Kakshya::DataDimension::COLOR, MayaFlux::Kakshya::DataDimension::CUSTOM, MayaFlux::Kakshya::DataDimension::frequency(), MayaFlux::Kakshya::DataDimension::grouped(), MayaFlux::Kakshya::DataDimension::POSITION, MayaFlux::Kakshya::DataDimension::spatial(), MayaFlux::Kakshya::DataDimension::time(), and MayaFlux::Kakshya::DataDimension::UV.

+ Here is the call graph for this function: