MayaFlux 1.0.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
StructureIntrospection.cpp
Go to the documentation of this file.
2
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 error<std::invalid_argument>(Journal::Component::Yantra, Journal::Context::Runtime, std::source_location::current(),
33 "Cannot infer structure from null container");
34 }
35
36 const auto& structure = container->get_structure();
37 auto dimensions = structure.dimensions;
38
39 auto modality = structure.modality;
40 if (modality == Kakshya::DataModality::UNKNOWN) {
41 modality = Kakshya::detect_data_modality(dimensions);
42 }
43
44 if (dimensions.empty()) {
45 auto total_elements = structure.get_total_elements();
46 if (total_elements > 0) {
47 dimensions.emplace_back(Kakshya::DataDimension::time(total_elements));
49 }
50 }
51
52 return std::make_pair(std::move(dimensions), modality);
53}
54
55std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
57{
58 std::vector<Kakshya::DataDimension> dimensions;
59 dimensions.emplace_back("elements", data.size(), 1, Kakshya::DataDimension::Role::CUSTOM);
60 return { std::move(dimensions), Kakshya::DataModality::TENSOR_ND };
61}
62
63std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
64infer_from_composite_container(const std::shared_ptr<Kakshya::CompositeContainer>& container)
65{
66 if (!container) {
67 error<std::invalid_argument>(Journal::Component::Yantra, Journal::Context::Runtime,
68 std::source_location::current(), "Cannot infer structure from null CompositeContainer");
69 }
70
71 auto dimensions = container->get_dimensions();
72 auto modality = container->get_structure().modality;
73 if (modality == Kakshya::DataModality::UNKNOWN)
75
76 return { std::move(dimensions), modality };
77}
78
79std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
80infer_from_region(const Kakshya::Region& region, const std::shared_ptr<Kakshya::SignalSourceContainer>& container)
81{
82 if (!container) {
83 std::vector<Kakshya::DataDimension> dimensions;
84 dimensions.emplace_back(Kakshya::DataDimension::time(1));
85 return std::make_pair(std::move(dimensions), Kakshya::DataModality::UNKNOWN);
86 }
87
88 auto structure = container->get_structure();
89
90 auto [dimensions, modality] = infer_from_container(container);
91
92 if (!region.start_coordinates.empty() && !region.end_coordinates.empty() && region.end_coordinates[1] != container->get_frame_size()) {
93 std::vector<uint64_t> shape;
94 int size = static_cast<int>(region.end_coordinates[0] - region.start_coordinates[0]);
95 shape.push_back(std::abs(size) + 1);
96 shape.push_back(region.end_coordinates[1]);
97
98 if (auto region_modality = region.get_attribute<Kakshya::DataModality>("modality");
99 region_modality.has_value()) {
100
101 dimensions = Kakshya::DataDimension::create_dimensions(region_modality.value(), shape, structure.memory_layout);
102 modality = region_modality.value();
103 } else {
104 dimensions = Kakshya::DataDimension::create_dimensions(modality, shape, structure.memory_layout);
105 }
106 }
107
108 return { dimensions, modality };
109}
110
111std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
112infer_from_segments(const std::vector<Kakshya::RegionSegment>& segments, const std::shared_ptr<Kakshya::SignalSourceContainer>& container)
113{
114 if (segments.empty() || !container) {
116 }
117
118 bool consistent_coords = std::ranges::all_of(segments,
119 [&](const auto& seg) {
120 return seg.source_region.end_coordinates.size() == segments[0].source_region.end_coordinates.size();
121 });
122
123 if (consistent_coords) {
124 return infer_from_region(segments[0].source_region, container);
125 }
126
127 auto max_coord_segment = std::ranges::max_element(segments,
128 [](const auto& a, const auto& b) {
129 return a.source_region.end_coordinates.size() < b.source_region.end_coordinates.size();
130 });
131 return infer_from_region(max_coord_segment->source_region, container);
132}
133
134std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
135infer_from_region_group(const Kakshya::RegionGroup& group, const std::shared_ptr<Kakshya::SignalSourceContainer>& container)
136{
137 if (!container || group.regions.empty()) {
139 }
140
141 auto structure = container->get_structure();
142 auto bounds_info = Kakshya::extract_group_bounds_info(group);
143
144 if (bounds_info.contains("bounding_min") && bounds_info.contains("bounding_max")) {
145 auto min_coords = safe_any_cast_or_throw<std::vector<uint64_t>>(bounds_info["bounding_min"]);
146 auto max_coords = safe_any_cast_or_throw<std::vector<uint64_t>>(bounds_info["bounding_max"]);
147
148 std::vector<uint64_t> shape;
149 int size = static_cast<int>(max_coords[0] - min_coords[0]);
150 shape.push_back(std::abs(size) + 1);
151 shape.push_back(max_coords[1]);
152
153 Kakshya::DataModality modality = structure.modality;
154 if (group.attributes.contains("modality")) {
155 auto modality_result = safe_any_cast<Kakshya::DataModality>(group.attributes.at("modality"));
156 if (modality_result)
157 modality = *modality_result.value;
158 }
159
160 auto dimensions = Kakshya::DataDimension::create_dimensions(modality, shape, structure.memory_layout);
161 return { dimensions, modality };
162 }
163
164 return infer_from_region(group.regions[0], container);
165}
166
167}
bool size
size_t a
size_t b
size_t size() const noexcept
Number of packed elements.
Owns a sequence of values that share a CompositeLayout.
@ Runtime
General runtime operations (default fallback)
@ Yantra
DSP algorithms, computational units, matrix operations, Grammar.
std::unordered_map< std::string, std::any > extract_group_bounds_info(const RegionGroup &group)
Extract bounds information from region group.
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:70
DataModality
Data modality types for cross-modal analysis.
Definition NDData.hpp:132
@ UNKNOWN
Unknown or undefined modality.
@ TENSOR_ND
N-dimensional tensor.
DataModality detect_data_modality(const std::vector< DataDimension > &dimensions)
Detects data modality from dimension information.
std::pair< std::vector< Kakshya::DataDimension >, Kakshya::DataModality > infer_from_composite_container(const std::shared_ptr< Kakshya::CompositeContainer > &container)
Infer the element axis and modality of a CompositeContainer.
std::pair< std::vector< Kakshya::DataDimension >, Kakshya::DataModality > infer_from_composite_array(const Kakshya::CompositeArray &data)
Infer the element axis and modality of a CompositeArray.
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_segments(const std::vector< Kakshya::RegionSegment > &segments, const std::shared_ptr< Kakshya::SignalSourceContainer > &container)
Infer structure from RegionSegments.
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_container(const std::shared_ptr< Kakshya::SignalSourceContainer > &container)
Infer structure from SignalSourceContainer.
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.
@ CUSTOM
User-defined or application-specific.
static DataDimension time(uint64_t samples, std::string name="time")
Convenience constructor for a temporal (time) dimension.
Definition NDData.cpp:17
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:127
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:330
std::vector< uint64_t > end_coordinates
Ending frame index (inclusive)
Definition Region.hpp:78
std::vector< uint64_t > start_coordinates
Starting frame index (inclusive)
Definition Region.hpp:75
Represents a point or span in N-dimensional space.
Definition Region.hpp:73