MayaFlux 0.5.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 309 of file DataUtils.cpp.

311{
312 MF_WARN(Journal::Component::Kakshya, Journal::Context::Runtime,
313 "{}\n{}\n{}",
314 "Inferring structure from DataVariant vector is not advisable as the method makes naive assumptions that can lead to massive computational errors. "
315 "If the variants are part of a container, region, or segment, please use the appropriate method instead. "
316 "If you are sure you want to proceed, please ignore this warning.");
317
318 if (variants.empty()) {
319 std::vector<DataDimension> dims;
320 dims.emplace_back("empty_variants", 0, 1, DataDimension::Role::CUSTOM);
321 return dims;
322 }
323
324 std::vector<DataDimension> dimensions;
325 size_t variant_count = variants.size();
326
327 size_t first_variant_size = std::visit([](const auto& vec) -> size_t {
328 return vec.size();
329 },
330 variants[0]);
331
332 bool consistent_glm = std::ranges::all_of(variants, [](const auto& variant) {
333 return std::visit([](const auto& vec) -> bool {
334 using ValueType = typename std::decay_t<decltype(vec)>::value_type;
335 return GlmData<ValueType>;
336 },
337 variant);
338 });
339
340 bool consistent_decimal = std::ranges::all_of(variants, [](const auto& variant) {
341 return std::visit([](const auto& vec) -> bool {
342 using ValueType = typename std::decay_t<decltype(vec)>::value_type;
343 return MayaFlux::DecimalData<ValueType>;
344 },
345 variant);
346 });
347
348 bool consistent_complex = std::ranges::all_of(variants, [](const auto& variant) {
349 return std::visit([](const auto& vec) -> bool {
350 using ValueType = typename std::decay_t<decltype(vec)>::value_type;
351 return MayaFlux::ComplexData<ValueType>;
352 },
353 variant);
354 });
355
356 bool consistent_integer = std::ranges::all_of(variants, [](const auto& variant) {
357 return std::visit([](const auto& vec) -> bool {
358 using ValueType = typename std::decay_t<decltype(vec)>::value_type;
359 return MayaFlux::IntegerData<ValueType>;
360 },
361 variant);
362 });
363
364 if (consistent_glm) {
365 dimensions.emplace_back(DataDimension::channel(variant_count));
366
367 std::visit([&](const auto& first_vec) {
368 using ValueType = typename std::decay_t<decltype(first_vec)>::value_type;
369 constexpr size_t components = glm_component_count<ValueType>();
370
371 DataDimension::Role role = DataDimension::Role::CUSTOM;
372 if constexpr (GlmVec2Type<ValueType>) {
373 role = DataDimension::Role::UV;
374 } else if constexpr (GlmVec3Type<ValueType>) {
375 role = DataDimension::Role::POSITION;
376 } else if constexpr (GlmVec4Type<ValueType>) {
377 role = DataDimension::Role::COLOR;
378 }
379
380 dimensions.emplace_back(DataDimension::grouped(
381 "glm_elements",
382 first_variant_size,
383 static_cast<uint8_t>(components),
384 role));
385 },
386 variants[0]);
387
388 return dimensions;
389 }
390
391 if (variant_count == 1) {
392 if (consistent_decimal) {
393 dimensions.emplace_back(DataDimension::time(first_variant_size, "samples"));
394 } else if (consistent_complex) {
395 dimensions.emplace_back(DataDimension::frequency(first_variant_size, "frequency_data"));
396 } else if (consistent_integer) {
397 dimensions.emplace_back(DataDimension::spatial(first_variant_size, 'x', 1, "data_points"));
398 } else {
399 dimensions.emplace_back("unknown_data", first_variant_size, 1,
400 DataDimension::Role::CUSTOM);
401 }
402
403 } else if (variant_count == 2 && (consistent_decimal || consistent_complex || consistent_integer)) {
404 dimensions.emplace_back(DataDimension::channel(2));
405 if (consistent_decimal) {
406 dimensions.emplace_back(DataDimension::time(first_variant_size, "samples"));
407 } else if (consistent_complex) {
408 dimensions.emplace_back(DataDimension::frequency(first_variant_size, "bins"));
409 } else {
410 dimensions.emplace_back(DataDimension::spatial(first_variant_size, 'x', 1, "elements"));
411 }
412
413 } else if (variant_count <= 16 && (consistent_decimal || consistent_complex || consistent_integer)) {
414 dimensions.emplace_back(DataDimension::channel(variant_count));
415 if (consistent_decimal) {
416 dimensions.emplace_back(DataDimension::time(first_variant_size, "samples"));
417 } else if (consistent_complex) {
418 dimensions.emplace_back(DataDimension::frequency(first_variant_size, "bins"));
419 } else {
420 dimensions.emplace_back(DataDimension::spatial(first_variant_size, 'x', 1, "pixels"));
421 }
422
423 } else if (consistent_decimal || consistent_complex || consistent_integer) {
424 if (consistent_decimal) {
425 dimensions.emplace_back(DataDimension::time(variant_count, "time_blocks"));
426 dimensions.emplace_back("block_samples", first_variant_size, 1,
427 DataDimension::Role::CUSTOM);
428 } else if (consistent_complex) {
429 dimensions.emplace_back(DataDimension::time(variant_count, "time_windows"));
430 dimensions.emplace_back(DataDimension::frequency(first_variant_size, "frequency_bins"));
431 } else {
432 dimensions.emplace_back(DataDimension::time(variant_count, "frames"));
433 dimensions.emplace_back(DataDimension::spatial(first_variant_size, 'x', 1, "frame_data"));
434 }
435
436 } else {
437 dimensions.emplace_back("mixed_variants", variant_count, 1,
438 DataDimension::Role::CUSTOM);
439 dimensions.emplace_back("variant_data", first_variant_size, 1,
440 DataDimension::Role::CUSTOM);
441 }
442
443 return dimensions;
444}
#define MF_WARN(comp, ctx,...)

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

+ Here is the call graph for this function: