MayaFlux 1.0.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
StructureIntrospection.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "DataSpec.hpp"
4
5namespace MayaFlux::Yantra {
6
7/**
8 * @brief Infer structure from DataVariant
9 */
10MAYAFLUX_API std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
12
13/**
14 * @brief Infer structure from vector of DataVariants (NEW)
15 */
16MAYAFLUX_API std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
17infer_from_data_variant_vector(const std::vector<Kakshya::DataVariant>& data);
18
19/**
20 * @brief Infer structure from SignalSourceContainer
21 */
22MAYAFLUX_API std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
23infer_from_container(const std::shared_ptr<Kakshya::SignalSourceContainer>& container);
24
25/**
26 * @brief Infer the element axis and modality of a CompositeArray.
27 * @note Field names and types remain in the array's CompositeLayout.
28 */
29MAYAFLUX_API std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
30infer_from_composite_array(const Kakshya::CompositeArray& data);
31
32/**
33 * @brief Infer the element axis and modality of a CompositeContainer.
34 * @note Field names and types remain in the container's CompositeLayout.
35 */
36MAYAFLUX_API std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
37infer_from_composite_container(const std::shared_ptr<Kakshya::CompositeContainer>& container);
38
39/**
40 * @brief Infer structure from Region (placeholder since regions are markers)
41 */
42MAYAFLUX_API std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
43infer_from_region(const Kakshya::Region& region, const std::shared_ptr<Kakshya::SignalSourceContainer>& container = nullptr);
44
45/**
46 * @brief Infer structure from RegionGroup
47 */
48MAYAFLUX_API std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
49infer_from_region_group(const Kakshya::RegionGroup& group, const std::shared_ptr<Kakshya::SignalSourceContainer>& container = nullptr);
50
51/**
52 * @brief Infer structure from RegionSegments
53 */
54MAYAFLUX_API std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
55infer_from_segments(const std::vector<Kakshya::RegionSegment>& segments, const std::shared_ptr<Kakshya::SignalSourceContainer>& container = nullptr);
56
57/**
58 * @brief Infer structure from Eigen matrix/vector
59 */
60template <typename EigenType>
61static std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
62infer_from_eigen(const EigenType& eigen_data)
63{
64 std::vector<Kakshya::DataDimension> dimensions;
65 Kakshya::DataModality modality {};
66
67 using Scalar = typename EigenType::Scalar;
68
69 if constexpr (EigenType::IsVectorAtCompileTime) {
70 if constexpr (MayaFlux::ComplexData<Scalar>) {
71 dimensions.emplace_back(Kakshya::DataDimension::frequency(eigen_data.size()));
73 } else if constexpr (MayaFlux::DecimalData<Scalar>) {
74 dimensions.emplace_back(Kakshya::DataDimension::time(eigen_data.size()));
76 } else {
77 dimensions.emplace_back(Kakshya::DataDimension("vector_data", eigen_data.size(), 1,
80 }
81 } else {
82 auto rows = eigen_data.rows();
83 auto cols = eigen_data.cols();
84
85 if constexpr (MayaFlux::ComplexData<Scalar>) {
86 dimensions.emplace_back(Kakshya::DataDimension::time(rows, "time_frames"));
87 dimensions.emplace_back(Kakshya::DataDimension::frequency(cols, "frequency_bins"));
89 } else if constexpr (MayaFlux::DecimalData<Scalar>) {
90 dimensions.emplace_back(Kakshya::DataDimension::time(rows, "samples"));
91 if (cols == 1) {
93 } else if (cols <= 16) {
94 dimensions.emplace_back(Kakshya::DataDimension::channel(cols));
96 } else {
97 dimensions.emplace_back(Kakshya::DataDimension::frequency(cols, "features"));
99 }
100 } else if constexpr (MayaFlux::IntegerData<Scalar>) {
101 dimensions.emplace_back(Kakshya::DataDimension::spatial(rows, 'y'));
102 dimensions.emplace_back(Kakshya::DataDimension::spatial(cols, 'x'));
104 } else {
105 dimensions.emplace_back(Kakshya::DataDimension("matrix_rows", rows, 1,
107 dimensions.emplace_back(Kakshya::DataDimension("matrix_cols", cols, 1,
110 }
111 }
112
113 return std::make_pair(std::move(dimensions), modality);
114}
115
116/**
117 * @brief Generic structure inference for unknown types
118 */
119template <typename T>
120static std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
122{
123 size_t size = 0;
124
125 if constexpr (requires { data.size(); }) {
126 size = data.size();
127 } else if constexpr (requires { std::size(data); }) {
128 size = std::size(data);
129 } else {
130 size = 1; // Single element
131 }
132
133 std::vector<Kakshya::DataDimension> dimensions;
134 dimensions.emplace_back(Kakshya::DataDimension::time(size));
135
136 return std::make_pair(std::move(dimensions), Kakshya::DataModality::TENSOR_ND);
137}
138
139/**
140 * @brief Infer dimensions and modality from any ComputeData type
141 * @tparam T ComputeData type
142 * @param data Input data to analyze
143 * @return Pair of (dimensions, modality)
144 */
145template <ComputeData T>
146static std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
147infer_structure(const T& data, const std::shared_ptr<Kakshya::SignalSourceContainer>& container = nullptr)
148{
149
150 if constexpr (CompositeArrayData<T>) {
151 return infer_from_composite_array(data);
152 } else if constexpr (CompositeContainerData<T>) {
154 } else if constexpr (std::is_same_v<T, Kakshya::DataVariant>) {
155 return infer_from_data_variant(data);
156 } else if constexpr (std::is_same_v<T, std::shared_ptr<Kakshya::SignalSourceContainer>>) {
157 return infer_from_container(data);
158 } else if constexpr (std::is_same_v<T, Kakshya::Region>) {
159 return infer_from_region(data, container);
160 } else if constexpr (std::is_same_v<T, Kakshya::RegionGroup>) {
161 return infer_from_region_group(data, container);
162 } else if constexpr (std::is_same_v<T, std::vector<Kakshya::RegionSegment>>) {
163 return infer_from_segments(data, container);
164 } else if constexpr (is_eigen_matrix_v<T>) {
165 return infer_from_eigen(data);
166 } else {
167 return infer_generic_structure(data);
168 }
169}
170
171}
bool size
uint32_t rows
An owning array of schema-bearing Composite elements.
Definition DataSpec.hpp:41
Shared ownership of a CompositeContainer.
Definition DataSpec.hpp:45
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
@ AUDIO_MULTICHANNEL
Multi-channel audio.
@ SPECTRAL_2D
2D spectral data (time + frequency)
@ TENSOR_ND
N-dimensional tensor.
@ IMAGE_2D
2D image (grayscale or single channel)
static std::pair< std::vector< Kakshya::DataDimension >, Kakshya::DataModality > infer_from_eigen(const EigenType &eigen_data)
Infer structure from Eigen matrix/vector.
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.
static std::pair< std::vector< Kakshya::DataDimension >, Kakshya::DataModality > infer_generic_structure(const T &data)
Generic structure inference for unknown types.
std::pair< std::vector< Kakshya::DataDimension >, Kakshya::DataModality > infer_from_data_variant(const Kakshya::DataVariant &data)
Infer structure from DataVariant.
static std::pair< std::vector< Kakshya::DataDimension >, Kakshya::DataModality > infer_structure(const T &data, const std::shared_ptr< Kakshya::SignalSourceContainer > &container=nullptr)
Infer dimensions and modality from any ComputeData type.
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 spatial(uint64_t size, char axis, uint64_t stride=1, std::string name="spatial")
Convenience constructor for a spatial dimension.
Definition NDData.cpp:37
static DataDimension frequency(uint64_t bins, std::string name="frequency")
Convenience constructor for a frequency dimension.
Definition NDData.cpp:32
static DataDimension time(uint64_t samples, std::string name="time")
Convenience constructor for a temporal (time) dimension.
Definition NDData.cpp:17
static DataDimension channel(uint64_t count, uint64_t stride=1)
Convenience constructor for a channel dimension.
Definition NDData.cpp:22
Minimal dimension descriptor focusing on structure only.
Definition NDData.hpp:197