MayaFlux 0.1.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 */
10std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
12
13/**
14 * @brief Infer structure from vector of DataVariants (NEW)
15 */
16std::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 */
22std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
23infer_from_container(const std::shared_ptr<Kakshya::SignalSourceContainer>& container);
24
25/**
26 * @brief Infer structure from Region (placeholder since regions are markers)
27 */
28std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
29infer_from_region(const Kakshya::Region& region, const std::shared_ptr<Kakshya::SignalSourceContainer>& container = nullptr);
30
31/**
32 * @brief Infer structure from RegionGroup
33 */
34std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
35infer_from_region_group(const Kakshya::RegionGroup& group, const std::shared_ptr<Kakshya::SignalSourceContainer>& container = nullptr);
36
37/**
38 * @brief Infer structure from RegionSegments
39 */
40std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
41infer_from_segments(const std::vector<Kakshya::RegionSegment>& segments, const std::shared_ptr<Kakshya::SignalSourceContainer>& container = nullptr);
42
43/**
44 * @brief Infer structure from Eigen matrix/vector
45 */
46template <typename EigenType>
47static std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
48infer_from_eigen(const EigenType& eigen_data)
49{
50 std::vector<Kakshya::DataDimension> dimensions;
51 Kakshya::DataModality modality {};
52
53 using Scalar = typename EigenType::Scalar;
54
55 if constexpr (EigenType::IsVectorAtCompileTime) {
56 if constexpr (MayaFlux::ComplexData<Scalar>) {
57 dimensions.emplace_back(Kakshya::DataDimension::frequency(eigen_data.size()));
59 } else if constexpr (MayaFlux::DecimalData<Scalar>) {
60 dimensions.emplace_back(Kakshya::DataDimension::time(eigen_data.size()));
62 } else {
63 dimensions.emplace_back(Kakshya::DataDimension("vector_data", eigen_data.size(), 1,
66 }
67 } else {
68 auto rows = eigen_data.rows();
69 auto cols = eigen_data.cols();
70
71 if constexpr (MayaFlux::ComplexData<Scalar>) {
72 dimensions.emplace_back(Kakshya::DataDimension::time(rows, "time_frames"));
73 dimensions.emplace_back(Kakshya::DataDimension::frequency(cols, "frequency_bins"));
75 } else if constexpr (MayaFlux::DecimalData<Scalar>) {
76 dimensions.emplace_back(Kakshya::DataDimension::time(rows, "samples"));
77 if (cols == 1) {
79 } else if (cols <= 16) {
80 dimensions.emplace_back(Kakshya::DataDimension::channel(cols));
82 } else {
83 dimensions.emplace_back(Kakshya::DataDimension::frequency(cols, "features"));
85 }
86 } else if constexpr (MayaFlux::IntegerData<Scalar>) {
87 dimensions.emplace_back(Kakshya::DataDimension::spatial(rows, 'y'));
88 dimensions.emplace_back(Kakshya::DataDimension::spatial(cols, 'x'));
90 } else {
91 dimensions.emplace_back(Kakshya::DataDimension("matrix_rows", rows, 1,
93 dimensions.emplace_back(Kakshya::DataDimension("matrix_cols", cols, 1,
96 }
97 }
98
99 return std::make_pair(std::move(dimensions), modality);
100}
101
102/**
103 * @brief Generic structure inference for unknown types
104 */
105template <typename T>
106static std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
108{
109 size_t size = 0;
110
111 if constexpr (requires { data.size(); }) {
112 size = data.size();
113 } else if constexpr (requires { std::size(data); }) {
114 size = std::size(data);
115 } else {
116 size = 1; // Single element
117 }
118
119 std::vector<Kakshya::DataDimension> dimensions;
120 dimensions.emplace_back(Kakshya::DataDimension::time(size));
121
122 return std::make_pair(std::move(dimensions), Kakshya::DataModality::TENSOR_ND);
123}
124
125/**
126 * @brief Infer dimensions and modality from any ComputeData type
127 * @tparam T ComputeData type
128 * @param data Input data to analyze
129 * @return Pair of (dimensions, modality)
130 */
131template <ComputeData T>
132static std::pair<std::vector<Kakshya::DataDimension>, Kakshya::DataModality>
133infer_structure(const T& data, const std::shared_ptr<Kakshya::SignalSourceContainer>& container = nullptr)
134{
135
136 if constexpr (std::is_same_v<T, Kakshya::DataVariant>) {
137 return infer_from_data_variant(data);
138 } else if constexpr (std::is_same_v<T, std::shared_ptr<Kakshya::SignalSourceContainer>>) {
139 return infer_from_container(data);
140 } else if constexpr (std::is_same_v<T, Kakshya::Region>) {
141 return infer_from_region(data, container);
142 } else if constexpr (std::is_same_v<T, Kakshya::RegionGroup>) {
143 return infer_from_region_group(data, container);
144 } else if constexpr (std::is_same_v<T, std::vector<Kakshya::RegionSegment>>) {
145 return infer_from_segments(data, container);
146 } else if constexpr (std::is_base_of_v<Eigen::MatrixBase<T>, T>) {
147 return infer_from_eigen(data);
148 } else {
149 return infer_generic_structure(data);
150 }
151}
152
153}
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
@ 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)
std::pair< std::vector< Kakshya::DataDimension >, Kakshya::DataModality > infer_from_container(const std::shared_ptr< Kakshya::SignalSourceContainer > &container)
Infer structure from SignalSourceContainer.
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_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)
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_region_group(const Kakshya::RegionGroup &group, const std::shared_ptr< Kakshya::SignalSourceContainer > &container)
Infer structure from RegionGroup.
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_segments(const std::vector< Kakshya::RegionSegment > &segments, const std::shared_ptr< Kakshya::SignalSourceContainer > &container)
Infer structure from RegionSegments.
@ 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:29
static DataDimension frequency(uint64_t bins, std::string name="frequency")
Convenience constructor for a frequency dimension.
Definition NDData.cpp:24
static DataDimension time(uint64_t samples, std::string name="time")
Convenience constructor for a temporal (time) dimension.
Definition NDData.cpp:14
static DataDimension channel(uint64_t count, uint64_t stride=1)
Convenience constructor for a channel dimension.
Definition NDData.cpp:19
Minimal dimension descriptor focusing on structure only.
Definition NDData.hpp:138