MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
StructureIntrospection.cpp
Go to the documentation of this file.
2
3#include <algorithm>
4
7
8namespace MayaFlux::Yantra {
9
10std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
12{
13 auto dimensions = Kakshya::detect_data_dimensions(data);
14 auto modality = Kakshya::detect_data_modality(dimensions);
15
16 return std::make_pair(std::move(dimensions), modality);
17}
18
19std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
20infer_from_data_variant_vector(const std::vector<Kakshya::DataVariant>& data)
21{
22 auto dimensions = Kakshya::detect_data_dimensions(data);
23 auto modality = Kakshya::detect_data_modality(dimensions);
24
25 return std::make_pair(std::move(dimensions), modality);
26}
27
28std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
29infer_from_container(const std::shared_ptr<Kakshya::SignalSourceContainer>& container)
30{
31 if (!container) {
32 throw std::invalid_argument("Cannot infer structure from null container");
33 }
34
35 const auto& structure = container->get_structure();
36 auto dimensions = structure.dimensions;
37
38 auto modality = structure.modality;
39 if (modality == Kakshya::DataModality::UNKNOWN) {
40 modality = Kakshya::detect_data_modality(dimensions);
41 }
42
43 if (dimensions.empty()) {
44 auto total_elements = structure.get_total_elements();
45 if (total_elements > 0) {
46 dimensions.emplace_back(Kakshya::DataDimension::time(total_elements));
48 }
49 }
50
51 return std::make_pair(std::move(dimensions), modality);
52}
53
54std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
55infer_from_region(const Kakshya::Region& region, const std::shared_ptr<Kakshya::SignalSourceContainer>& container)
56{
57 if (!container) {
58 std::vector<Kakshya::DataDimension> dimensions;
59 dimensions.emplace_back(Kakshya::DataDimension::time(1));
60 return std::make_pair(std::move(dimensions), Kakshya::DataModality::UNKNOWN);
61 }
62
63 auto structure = container->get_structure();
64
65 auto [dimensions, modality] = infer_from_container(container);
66
67 if (!region.start_coordinates.empty() && !region.end_coordinates.empty() && region.end_coordinates[1] != container->get_frame_size()) {
68 std::vector<uint64_t> shape;
69 int size = static_cast<int>(region.end_coordinates[0] - region.start_coordinates[0]);
70 shape.push_back(std::abs(size) + 1);
71 shape.push_back(region.end_coordinates[1]);
72
73 if (auto region_modality = region.get_attribute<Kakshya::DataModality>("modality");
74 region_modality.has_value()) {
75
76 dimensions = Kakshya::DataDimension::create_dimensions(region_modality.value(), shape, structure.memory_layout);
77 modality = region_modality.value();
78 } else {
79 dimensions = Kakshya::DataDimension::create_dimensions(modality, shape, structure.memory_layout);
80 }
81 }
82
83 return { dimensions, modality };
84}
85
86std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
87infer_from_segments(const std::vector<Kakshya::RegionSegment>& segments, const std::shared_ptr<Kakshya::SignalSourceContainer>& container)
88{
89 if (segments.empty() || !container) {
91 }
92
93 bool consistent_coords = std::ranges::all_of(segments,
94 [&](const auto& seg) {
95 return seg.source_region.end_coordinates.size() == segments[0].source_region.end_coordinates.size();
96 });
97
98 if (consistent_coords) {
99 return infer_from_region(segments[0].source_region, container);
100 }
101
102 auto max_coord_segment = std::ranges::max_element(segments,
103 [](const auto& a, const auto& b) {
104 return a.source_region.end_coordinates.size() < b.source_region.end_coordinates.size();
105 });
106 return infer_from_region(max_coord_segment->source_region, container);
107}
108
109std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
110infer_from_region_group(const Kakshya::RegionGroup& group, const std::shared_ptr<Kakshya::SignalSourceContainer>& container)
111{
112 if (!container || group.regions.empty()) {
114 }
115
116 auto structure = container->get_structure();
117 auto bounds_info = Kakshya::extract_group_bounds_info(group);
118
119 if (bounds_info.contains("bounding_min") && bounds_info.contains("bounding_max")) {
120 auto min_coords = std::any_cast<std::vector<uint64_t>>(bounds_info["bounding_min"]);
121 auto max_coords = std::any_cast<std::vector<uint64_t>>(bounds_info["bounding_max"]);
122
123 std::vector<uint64_t> shape;
124 int size = static_cast<int>(max_coords[0] - min_coords[0]);
125 shape.push_back(std::abs(size) + 1);
126 shape.push_back(max_coords[1]);
127
128 auto modality = group.attributes.contains("modality") ? std::any_cast<Kakshya::DataModality>(group.attributes.at("modality")) : structure.modality;
129
130 auto dimensions = Kakshya::DataDimension::create_dimensions(modality, shape, structure.memory_layout);
131 return { dimensions, modality };
132 }
133
134 return infer_from_region(group.regions[0], container);
135}
136
137}
std::vector< DataDimension > detect_data_dimensions(const DataVariant &data)
Detect data dimensions from a DataVariant.
std::variant< std::vector< double >, std::vector< float >, std::vector< uint8_t >, std::vector< uint16_t >, std::vector< uint32_t >, std::vector< std::complex< float > >, std::vector< std::complex< double > >, std::vector< glm::vec2 >, std::vector< glm::vec3 >, std::vector< glm::vec4 >, std::vector< glm::mat4 > > DataVariant
Multi-type data storage for different precision needs.
Definition NDData.hpp:73
DataModality
Data modality types for cross-modal analysis.
Definition NDData.hpp:78
@ UNKNOWN
Unknown or undefined modality.
DataModality detect_data_modality(const std::vector< DataDimension > &dimensions)
Detects data modality from dimension information.
Definition DataUtils.cpp:72
std::unordered_map< std::string, std::any > extract_group_bounds_info(const RegionGroup &group)
Extract bounds information from region group.
std::pair< std::vector< Kakshya::DataDimension >, Kakshya::DataModality > infer_from_container(const std::shared_ptr< Kakshya::SignalSourceContainer > &container)
Infer structure from SignalSourceContainer.
std::pair< std::vector< Kakshya::DataDimension >, Kakshya::DataModality > infer_from_data_variant(const Kakshya::DataVariant &data)
Infer structure from DataVariant.
std::pair< std::vector< Kakshya::DataDimension >, Kakshya::DataModality > infer_from_data_variant_vector(const std::vector< Kakshya::DataVariant > &data)
Infer structure from vector of DataVariants (NEW)
std::pair< std::vector< Kakshya::DataDimension >, Kakshya::DataModality > infer_from_region(const Kakshya::Region &region, const std::shared_ptr< Kakshya::SignalSourceContainer > &container)
Infer structure from Region (placeholder since regions are markers)
std::pair< std::vector< Kakshya::DataDimension >, Kakshya::DataModality > infer_from_region_group(const Kakshya::RegionGroup &group, const std::shared_ptr< Kakshya::SignalSourceContainer > &container)
Infer structure from RegionGroup.
std::pair< std::vector< Kakshya::DataDimension >, Kakshya::DataModality > infer_from_segments(const std::vector< Kakshya::RegionSegment > &segments, const std::shared_ptr< Kakshya::SignalSourceContainer > &container)
Infer structure from RegionSegments.
static DataDimension time(uint64_t samples, std::string name="time")
Convenience constructor for a temporal (time) dimension.
Definition NDData.cpp:14
static std::vector< DataDimension > create_dimensions(DataModality modality, const std::vector< uint64_t > &shape, MemoryLayout layout=MemoryLayout::ROW_MAJOR)
Create dimension descriptors for a data modality.
Definition NDData.cpp:105
std::unordered_map< std::string, std::any > attributes
Flexible key-value store for group-specific attributes.
std::vector< Region > regions
Collection of regions belonging to this group.
Organizes related signal regions into a categorized collection.
std::optional< T > get_attribute(const std::string &key) const
Get an attribute value by key, with type conversion support.
Definition Region.hpp:324
std::vector< uint64_t > end_coordinates
Ending frame index (inclusive)
Definition Region.hpp:72
std::vector< uint64_t > start_coordinates
Starting frame index (inclusive)
Definition Region.hpp:69
Represents a point or span in N-dimensional space.
Definition Region.hpp:67