MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
StructureIntrospection.cpp
Go to the documentation of this file.
2
5
6namespace MayaFlux::Yantra {
7
8std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
10{
11 auto dimensions = Kakshya::detect_data_dimensions(data);
12 auto modality = Kakshya::detect_data_modality(dimensions);
13
14 return std::make_pair(std::move(dimensions), modality);
15}
16
17std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
18infer_from_data_variant_vector(const std::vector<Kakshya::DataVariant>& data)
19{
20 auto dimensions = Kakshya::detect_data_dimensions(data);
21 auto modality = Kakshya::detect_data_modality(dimensions);
22
23 return std::make_pair(std::move(dimensions), modality);
24}
25
26std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
27infer_from_container(const std::shared_ptr<Kakshya::SignalSourceContainer>& container)
28{
29 if (!container) {
30 error<std::invalid_argument>(Journal::Component::Yantra, Journal::Context::Runtime, std::source_location::current(),
31 "Cannot infer structure from null container");
32 }
33
34 const auto& structure = container->get_structure();
35 auto dimensions = structure.dimensions;
36
37 auto modality = structure.modality;
38 if (modality == Kakshya::DataModality::UNKNOWN) {
39 modality = Kakshya::detect_data_modality(dimensions);
40 }
41
42 if (dimensions.empty()) {
43 auto total_elements = structure.get_total_elements();
44 if (total_elements > 0) {
45 dimensions.emplace_back(Kakshya::DataDimension::time(total_elements));
47 }
48 }
49
50 return std::make_pair(std::move(dimensions), modality);
51}
52
53std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
54infer_from_region(const Kakshya::Region& region, const std::shared_ptr<Kakshya::SignalSourceContainer>& container)
55{
56 if (!container) {
57 std::vector<Kakshya::DataDimension> dimensions;
58 dimensions.emplace_back(Kakshya::DataDimension::time(1));
59 return std::make_pair(std::move(dimensions), Kakshya::DataModality::UNKNOWN);
60 }
61
62 auto structure = container->get_structure();
63
64 auto [dimensions, modality] = infer_from_container(container);
65
66 if (!region.start_coordinates.empty() && !region.end_coordinates.empty() && region.end_coordinates[1] != container->get_frame_size()) {
67 std::vector<uint64_t> shape;
68 int size = static_cast<int>(region.end_coordinates[0] - region.start_coordinates[0]);
69 shape.push_back(std::abs(size) + 1);
70 shape.push_back(region.end_coordinates[1]);
71
72 if (auto region_modality = region.get_attribute<Kakshya::DataModality>("modality");
73 region_modality.has_value()) {
74
75 dimensions = Kakshya::DataDimension::create_dimensions(region_modality.value(), shape, structure.memory_layout);
76 modality = region_modality.value();
77 } else {
78 dimensions = Kakshya::DataDimension::create_dimensions(modality, shape, structure.memory_layout);
79 }
80 }
81
82 return { dimensions, modality };
83}
84
85std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
86infer_from_segments(const std::vector<Kakshya::RegionSegment>& segments, const std::shared_ptr<Kakshya::SignalSourceContainer>& container)
87{
88 if (segments.empty() || !container) {
90 }
91
92 bool consistent_coords = std::ranges::all_of(segments,
93 [&](const auto& seg) {
94 return seg.source_region.end_coordinates.size() == segments[0].source_region.end_coordinates.size();
95 });
96
97 if (consistent_coords) {
98 return infer_from_region(segments[0].source_region, container);
99 }
100
101 auto max_coord_segment = std::ranges::max_element(segments,
102 [](const auto& a, const auto& b) {
103 return a.source_region.end_coordinates.size() < b.source_region.end_coordinates.size();
104 });
105 return infer_from_region(max_coord_segment->source_region, container);
106}
107
108std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
109infer_from_region_group(const Kakshya::RegionGroup& group, const std::shared_ptr<Kakshya::SignalSourceContainer>& container)
110{
111 if (!container || group.regions.empty()) {
113 }
114
115 auto structure = container->get_structure();
116 auto bounds_info = Kakshya::extract_group_bounds_info(group);
117
118 if (bounds_info.contains("bounding_min") && bounds_info.contains("bounding_max")) {
119 auto min_coords = safe_any_cast_or_throw<std::vector<uint64_t>>(bounds_info["bounding_min"]);
120 auto max_coords = safe_any_cast_or_throw<std::vector<uint64_t>>(bounds_info["bounding_max"]);
121
122 std::vector<uint64_t> shape;
123 int size = static_cast<int>(max_coords[0] - min_coords[0]);
124 shape.push_back(std::abs(size) + 1);
125 shape.push_back(max_coords[1]);
126
127 Kakshya::DataModality modality = structure.modality;
128 if (group.attributes.contains("modality")) {
129 auto modality_result = safe_any_cast<Kakshya::DataModality>(group.attributes.at("modality"));
130 if (modality_result)
131 modality = *modality_result.value;
132 }
133
134 auto dimensions = Kakshya::DataDimension::create_dimensions(modality, shape, structure.memory_layout);
135 return { dimensions, modality };
136 }
137
138 return infer_from_region(group.regions[0], container);
139}
140
141}
size_t a
size_t b
Range size
@ Runtime
General runtime operations (default fallback)
@ Yantra
DSP algorithms, computational units, matrix operations, Grammar.
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:76
DataModality
Data modality types for cross-modal analysis.
Definition NDData.hpp:81
@ 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: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:108
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