360{
361 MF_WARN(Journal::Component::Kakshya, Journal::Context::Runtime,
362 "{}\n{}\n{}",
363 "Inferring structure from DataVariant vector is not advisable as the method makes naive assumptions that can lead to massive computational errors. "
364 "If the variants are part of a container, region, or segment, please use the appropriate method instead. "
365 "If you are sure you want to proceed, please ignore this warning.");
366
367 if (variants.empty()) {
368 std::vector<DataDimension> dims;
369 dims.emplace_back("empty_variants", 0, 1, DataDimension::Role::CUSTOM);
370 return dims;
371 }
372
373 std::vector<DataDimension> dimensions;
374 size_t variant_count = variants.size();
375
376 size_t first_variant_size = std::visit([](const auto& vec) -> size_t {
377 return vec.size();
378 },
379 variants[0]);
380
381 bool consistent_glm = std::ranges::all_of(variants, [](const auto& variant) {
382 return std::visit([](const auto& vec) -> bool {
383 using ValueType = typename std::decay_t<decltype(vec)>::value_type;
384 return GlmData<ValueType>;
385 },
386 variant);
387 });
388
389 bool consistent_decimal = std::ranges::all_of(variants, [](const auto& variant) {
390 return std::visit([](const auto& vec) -> bool {
391 using ValueType = typename std::decay_t<decltype(vec)>::value_type;
392 return MayaFlux::DecimalData<ValueType>;
393 },
394 variant);
395 });
396
397 bool consistent_complex = std::ranges::all_of(variants, [](const auto& variant) {
398 return std::visit([](const auto& vec) -> bool {
399 using ValueType = typename std::decay_t<decltype(vec)>::value_type;
400 return MayaFlux::ComplexData<ValueType>;
401 },
402 variant);
403 });
404
405 bool consistent_integer = std::ranges::all_of(variants, [](const auto& variant) {
406 return std::visit([](const auto& vec) -> bool {
407 using ValueType = typename std::decay_t<decltype(vec)>::value_type;
408 return MayaFlux::IntegerData<ValueType>;
409 },
410 variant);
411 });
412
413 if (consistent_glm) {
414 dimensions.emplace_back(DataDimension::channel(variant_count));
415
416 std::visit([&](const auto& first_vec) {
417 using ValueType = typename std::decay_t<decltype(first_vec)>::value_type;
418 constexpr size_t components = glm_component_count<ValueType>();
419
420 DataDimension::Role role = DataDimension::Role::CUSTOM;
421 if constexpr (GlmVec2Type<ValueType>) {
422 role = DataDimension::Role::UV;
423 } else if constexpr (GlmVec3Type<ValueType>) {
424 role = DataDimension::Role::POSITION;
425 } else if constexpr (GlmVec4Type<ValueType>) {
426 role = DataDimension::Role::COLOR;
427 }
428
429 dimensions.emplace_back(DataDimension::grouped(
430 "glm_elements",
431 first_variant_size,
432 static_cast<uint8_t>(components),
433 role));
434 },
435 variants[0]);
436
437 return dimensions;
438 }
439
440 if (variant_count == 1) {
441 if (consistent_decimal) {
442 dimensions.emplace_back(DataDimension::time(first_variant_size, "samples"));
443 } else if (consistent_complex) {
444 dimensions.emplace_back(DataDimension::frequency(first_variant_size, "frequency_data"));
445 } else if (consistent_integer) {
446 dimensions.emplace_back(DataDimension::spatial(first_variant_size, 'x', 1, "data_points"));
447 } else {
448 dimensions.emplace_back("unknown_data", first_variant_size, 1,
449 DataDimension::Role::CUSTOM);
450 }
451
452 } else if (variant_count == 2 && (consistent_decimal || consistent_complex || consistent_integer)) {
453 dimensions.emplace_back(DataDimension::channel(2));
454 if (consistent_decimal) {
455 dimensions.emplace_back(DataDimension::time(first_variant_size, "samples"));
456 } else if (consistent_complex) {
457 dimensions.emplace_back(DataDimension::frequency(first_variant_size, "bins"));
458 } else {
459 dimensions.emplace_back(DataDimension::spatial(first_variant_size, 'x', 1, "elements"));
460 }
461
462 } else if (variant_count <= 16 && (consistent_decimal || consistent_complex || consistent_integer)) {
463 dimensions.emplace_back(DataDimension::channel(variant_count));
464 if (consistent_decimal) {
465 dimensions.emplace_back(DataDimension::time(first_variant_size, "samples"));
466 } else if (consistent_complex) {
467 dimensions.emplace_back(DataDimension::frequency(first_variant_size, "bins"));
468 } else {
469 dimensions.emplace_back(DataDimension::spatial(first_variant_size, 'x', 1, "pixels"));
470 }
471
472 } else if (consistent_decimal || consistent_complex || consistent_integer) {
473 if (consistent_decimal) {
474 dimensions.emplace_back(DataDimension::time(variant_count, "time_blocks"));
475 dimensions.emplace_back("block_samples", first_variant_size, 1,
476 DataDimension::Role::CUSTOM);
477 } else if (consistent_complex) {
478 dimensions.emplace_back(DataDimension::time(variant_count, "time_windows"));
479 dimensions.emplace_back(DataDimension::frequency(first_variant_size, "frequency_bins"));
480 } else {
481 dimensions.emplace_back(DataDimension::time(variant_count, "frames"));
482 dimensions.emplace_back(DataDimension::spatial(first_variant_size, 'x', 1, "frame_data"));
483 }
484
485 } else {
486 dimensions.emplace_back("mixed_variants", variant_count, 1,
487 DataDimension::Role::CUSTOM);
488 dimensions.emplace_back("variant_data", first_variant_size, 1,
489 DataDimension::Role::CUSTOM);
490 }
491
492 return dimensions;
493}
#define MF_WARN(comp, ctx,...)