MayaFlux 0.1.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
NDData.cpp
Go to the documentation of this file.
1#include "NDData.hpp"
3
4namespace MayaFlux::Kakshya {
5
6DataDimension::DataDimension(std::string n, uint64_t s, uint64_t st, Role r)
7 : name(std::move(n))
8 , size(s)
9 , stride(st)
10 , role(r)
11{
12}
13
14DataDimension DataDimension::time(uint64_t samples, std::string name)
15{
16 return { std::move(name), samples, 1, Role::TIME };
17}
18
19DataDimension DataDimension::channel(uint64_t count, uint64_t stride)
20{
21 return { "channel", count, stride, Role::CHANNEL };
22}
23
24DataDimension DataDimension::frequency(uint64_t bins, std::string name)
25{
26 return { std::move(name), bins, 1, Role::FREQUENCY };
27}
28
29DataDimension DataDimension::spatial(uint64_t size, char axis, uint64_t stride, std::string name)
30{
31 Role r = [axis]() {
32 switch (axis) {
33 case 'x':
34 return Role::SPATIAL_X;
35 case 'y':
36 return Role::SPATIAL_Y;
37 case 'z':
38 default:
39 return Role::SPATIAL_Z;
40 }
41 }();
42
43 if (name == "") {
44 name = std::string("spatial_") + axis;
45 }
46 return { name, size, stride, r };
47}
48
50{
51 return spatial(width, 'x');
52}
53
54DataDimension DataDimension::spatial_2d(uint64_t width, uint64_t height)
55{
56 return spatial(height, 'y', width * sizeof(float));
57}
58
59DataDimension DataDimension::spatial_3d(uint64_t width, uint64_t height, uint64_t depth)
60{
61 return spatial(depth, 'z', width * height * sizeof(float));
62}
63
65{
66 return { "mip_levels", levels, 1, Role::MIP_LEVEL };
67}
68
70 std::string name,
71 uint64_t element_count,
72 uint8_t components_per_element,
73 Role role)
74{
75 DataDimension dim { std::move(name), element_count, 1, role };
76 dim.grouping = ComponentGroup { components_per_element, 0 };
77 return dim;
78}
79
80std::string_view modality_to_string(DataModality modality)
81{
82 return Utils::enum_to_string(modality);
83}
84
86{
87 return grouped("positions", count, 3, Role::POSITION);
88}
89
91{
92 return grouped("normals", count, 3, Role::NORMAL);
93}
94
96{
97 return grouped("uvs", count, 2, Role::UV);
98}
99
100DataDimension DataDimension::vertex_colors(uint64_t count, bool has_alpha)
101{
102 return grouped("colors", count, has_alpha ? 4 : 3, Role::COLOR);
103}
104
105std::vector<DataDimension> DataDimension::create_dimensions(
106 DataModality modality,
107 const std::vector<uint64_t>& shape,
108 MemoryLayout layout)
109{
110 std::vector<DataDimension> dims;
111 auto strides = calculate_strides(shape, layout);
112
113 switch (modality) {
115 if (shape.size() != 1) {
116 throw std::invalid_argument("AUDIO_1D requires 1D shape");
117 }
118 dims.push_back(DataDimension::time(shape[0]));
119 break;
120
122 if (shape.size() != 2) {
123 throw std::invalid_argument("AUDIO_MULTICHANNEL requires 2D shape [samples, channels]");
124 }
125 dims.push_back(DataDimension::time(shape[0]));
126 dims.push_back(DataDimension::channel(shape[1], strides[1]));
127 break;
128
130 if (shape.size() != 2) {
131 throw std::invalid_argument("IMAGE_2D requires 2D shape [height, width]");
132 }
133 dims.push_back(DataDimension::spatial(shape[0], 'y', strides[0]));
134 dims.push_back(DataDimension::spatial(shape[1], 'x', strides[1]));
135 break;
136
138 if (shape.size() != 3) {
139 throw std::invalid_argument("IMAGE_COLOR requires 3D shape [height, width, channels]");
140 }
141 dims.push_back(DataDimension::spatial(shape[0], 'y', strides[0]));
142 dims.push_back(DataDimension::spatial(shape[1], 'x', strides[1]));
143 dims.push_back(DataDimension::channel(shape[2], strides[2]));
144 break;
145
147 if (shape.size() != 2) {
148 throw std::invalid_argument("SPECTRAL_2D requires 2D shape [time_windows, frequency_bins]");
149 }
150 dims.push_back(DataDimension::time(shape[0], "time_windows"));
151 dims.push_back(DataDimension::frequency(shape[1]));
152 dims[1].stride = strides[1];
153 break;
154
156 if (shape.size() != 3) {
157 throw std::invalid_argument("VOLUMETRIC_3D requires 3D shape [x, y, z]");
158 }
159 dims.push_back(DataDimension::spatial(shape[0], 'x', strides[0]));
160 dims.push_back(DataDimension::spatial(shape[1], 'y', strides[1]));
161 dims.push_back(DataDimension::spatial(shape[2], 'z', strides[2]));
162 break;
163
165 if (shape.size() != 3) {
166 throw std::invalid_argument("VIDEO_GRAYSCALE requires 3D shape [frames, height, width]");
167 }
168 dims.push_back(DataDimension::time(shape[0], "frames"));
169 dims.push_back(DataDimension::spatial(shape[1], 'y', strides[1]));
170 dims.push_back(DataDimension::spatial(shape[2], 'x', strides[2]));
171 break;
172
174 if (shape.size() != 4) {
175 throw std::invalid_argument("VIDEO_COLOR requires 4D shape [frames, height, width, channels]");
176 }
177 dims.push_back(DataDimension::time(shape[0], "frames"));
178 dims.push_back(DataDimension::spatial(shape[1], 'y', strides[1]));
179 dims.push_back(DataDimension::spatial(shape[2], 'x', strides[2]));
180 dims.push_back(DataDimension::channel(shape[3], strides[3]));
181 break;
182
183 default:
184 throw std::invalid_argument("Unsupported modality for dimension creation");
185 }
186
187 return dims;
188}
189
191 const std::vector<uint64_t>& shape,
192 MemoryLayout layout)
193{
194 if (shape.empty())
195 return {};
196
197 std::vector<uint64_t> strides(shape.size());
198
199 if (layout == MemoryLayout::ROW_MAJOR) {
200 auto reversed_shape = shape | std::views::reverse;
201 std::exclusive_scan(
202 reversed_shape.begin(),
203 reversed_shape.end(),
204 strides.rbegin(),
205 1U,
206 std::multiplies<uint64_t> {});
207 } else {
208 std::exclusive_scan(
209 shape.begin(),
210 shape.end(),
211 strides.begin(),
212 1U,
213 std::multiplies<uint64_t> {});
214 }
215
216 return strides;
217}
218
219}
DataModality
Data modality types for cross-modal analysis.
Definition NDData.hpp:78
@ AUDIO_MULTICHANNEL
Multi-channel audio.
@ SPECTRAL_2D
2D spectral data (time + frequency)
@ VOLUMETRIC_3D
3D volumetric data
@ VIDEO_GRAYSCALE
3D video (time + 2D grayscale)
@ VIDEO_COLOR
4D video (time + 2D + color)
@ IMAGE_COLOR
2D RGB/RGBA image
@ IMAGE_2D
2D image (grayscale or single channel)
MemoryLayout
Memory layout for multi-dimensional data.
Definition NDData.hpp:36
@ ROW_MAJOR
C/C++ style (last dimension varies fastest)
std::string_view modality_to_string(DataModality modality)
Convert DataModality enum to string representation.
Definition NDData.cpp:80
constexpr std::string_view enum_to_string(EnumType value) noexcept
Universal enum to string converter using magic_enum (original case)
Definition EnumUtils.hpp:51
Grouping information for sub-dimensions.
Definition NDData.hpp:169
static DataDimension spatial_2d(uint64_t width, uint64_t height)
Convenience constructor for a 2D spatial dimension.
Definition NDData.cpp:54
Role
Semantic role of the dimension.
Definition NDData.hpp:145
@ FREQUENCY
Spectral/frequency axis.
@ TIME
Temporal progression (samples, frames, steps)
@ POSITION
Vertex positions (3D space)
@ CHANNEL
Parallel streams (audio channels, color channels)
@ SPATIAL_X
Spatial X axis (images, tensors)
uint64_t stride
Memory stride (elements between consecutive indices)
Definition NDData.hpp:189
std::string name
Human-readable identifier for the dimension.
Definition NDData.hpp:187
static DataDimension vertex_positions(uint64_t count)
Create dimension for vertex positions (vec3)
Definition NDData.cpp:85
uint64_t size
Number of elements in this dimension.
Definition NDData.hpp:188
static DataDimension vertex_colors(uint64_t count, bool has_alpha=false)
Create dimension for colors (vec3 or vec4)
Definition NDData.cpp:100
Role role
Semantic hint for common operations.
Definition NDData.hpp:190
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 grouped(std::string name, uint64_t element_count, uint8_t components_per_element, Role role=Role::CUSTOM)
Create dimension with component grouping.
Definition NDData.cpp:69
static DataDimension vertex_normals(uint64_t count)
Create dimension for vertex normals (vec3)
Definition NDData.cpp:90
static DataDimension frequency(uint64_t bins, std::string name="frequency")
Convenience constructor for a frequency dimension.
Definition NDData.cpp:24
static DataDimension spatial_1d(uint64_t width)
Convenience constructor for an array dimension.
Definition NDData.cpp:49
static DataDimension time(uint64_t samples, std::string name="time")
Convenience constructor for a temporal (time) dimension.
Definition NDData.cpp:14
static std::vector< uint64_t > calculate_strides(const std::vector< uint64_t > &shape, MemoryLayout layout)
Calculate memory strides based on shape and layout.
Definition NDData.cpp:190
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
static DataDimension mipmap_levels(uint64_t levels)
Create dimension for mipmap levels.
Definition NDData.cpp:64
static DataDimension texture_coords(uint64_t count)
Create dimension for texture coordinates (vec2)
Definition NDData.cpp:95
static DataDimension spatial_3d(uint64_t width, uint64_t height, uint64_t depth)
Convenience constructor for a 3D spatial dimension.
Definition NDData.cpp:59
std::optional< ComponentGroup > grouping
Definition NDData.hpp:185
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