MayaFlux 0.4.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 258 of file DataUtils.cpp.

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