MayaFlux 0.3.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
NDData.cpp
Go to the documentation of this file.
1#include "NDData.hpp"
2
4
6
7namespace MayaFlux::Kakshya {
8
9DataDimension::DataDimension(std::string n, uint64_t s, uint64_t st, Role r)
10 : name(std::move(n))
11 , size(s)
12 , stride(st)
13 , role(r)
14{
15}
16
17DataDimension DataDimension::time(uint64_t samples, std::string name)
18{
19 return { std::move(name), samples, 1, Role::TIME };
20}
21
22DataDimension DataDimension::channel(uint64_t count, uint64_t stride)
23{
24 return { "channel", count, stride, Role::CHANNEL };
25}
26
27DataDimension DataDimension::frequency(uint64_t bins, std::string name)
28{
29 return { std::move(name), bins, 1, Role::FREQUENCY };
30}
31
32DataDimension DataDimension::spatial(uint64_t size, char axis, uint64_t stride, std::string name)
33{
34 Role r = [axis]() {
35 switch (axis) {
36 case 'x':
37 return Role::SPATIAL_X;
38 case 'y':
39 return Role::SPATIAL_Y;
40 case 'z':
41 default:
42 return Role::SPATIAL_Z;
43 }
44 }();
45
46 if (name == "") {
47 name = std::string("spatial_") + axis;
48 }
49 return { name, size, stride, r };
50}
51
53{
54 return spatial(width, 'x');
55}
56
57DataDimension DataDimension::spatial_2d(uint64_t width, uint64_t height)
58{
59 return spatial(height, 'y', width * sizeof(float));
60}
61
62DataDimension DataDimension::spatial_3d(uint64_t width, uint64_t height, uint64_t depth)
63{
64 return spatial(depth, 'z', width * height * sizeof(float));
65}
66
68{
69 return { "mip_levels", levels, 1, Role::MIP_LEVEL };
70}
71
73 std::string name,
74 uint64_t element_count,
75 uint8_t components_per_element,
76 Role role)
77{
78 DataDimension dim { std::move(name), element_count, 1, role };
79 dim.grouping = ComponentGroup { components_per_element, 0 };
80 return dim;
81}
82
83std::string_view modality_to_string(DataModality modality)
84{
85 return Reflect::enum_to_string(modality);
86}
87
89{
90 return grouped("positions", count, 3, Role::POSITION);
91}
92
94{
95 return grouped("normals", count, 3, Role::NORMAL);
96}
97
99{
100 return grouped("uvs", count, 2, Role::UV);
101}
102
104{
105 return grouped("colors", count, has_alpha ? 4 : 3, Role::COLOR);
106}
107
108std::vector<DataDimension> DataDimension::create_dimensions(
109 DataModality modality,
110 const std::vector<uint64_t>& shape,
111 MemoryLayout layout)
112{
113 std::vector<DataDimension> dims;
114 auto strides = calculate_strides(shape, layout);
115
116 switch (modality) {
118 if (shape.size() != 1) {
119 error<std::invalid_argument>(
122 std::source_location::current(),
123 "AUDIO_1D requires 1D shape");
124 }
125 dims.push_back(DataDimension::time(shape[0]));
126 break;
127
129 if (shape.size() != 2) {
130 error<std::invalid_argument>(
133 std::source_location::current(),
134 "AUDIO_MULTICHANNEL requires 2D shape [samples, channels]");
135 }
136 dims.push_back(DataDimension::time(shape[0]));
137 dims.push_back(DataDimension::channel(shape[1], strides[1]));
138 break;
139
141 if (shape.size() != 2) {
142 error<std::invalid_argument>(
145 std::source_location::current(),
146 "IMAGE_2D requires 2D shape [height, width]");
147 }
148 dims.push_back(DataDimension::spatial(shape[0], 'y', strides[0]));
149 dims.push_back(DataDimension::spatial(shape[1], 'x', strides[1]));
150 break;
151
153 if (shape.size() != 3) {
154 error<std::invalid_argument>(
157 std::source_location::current(),
158 "IMAGE_COLOR requires 3D shape [height, width, channels]");
159 }
160 dims.push_back(DataDimension::spatial(shape[0], 'y', strides[0]));
161 dims.push_back(DataDimension::spatial(shape[1], 'x', strides[1]));
162 dims.push_back(DataDimension::channel(shape[2], strides[2]));
163 break;
164
166 if (shape.size() != 2) {
167 error<std::invalid_argument>(
170 std::source_location::current(),
171 "SPECTRAL_2D requires 2D shape [time_windows, frequency_bins]");
172 }
173 dims.push_back(DataDimension::time(shape[0], "time_windows"));
174 dims.push_back(DataDimension::frequency(shape[1]));
175 dims[1].stride = strides[1];
176 break;
177
179 if (shape.size() != 3) {
180 error<std::invalid_argument>(
183 std::source_location::current(),
184 "VOLUMETRIC_3D requires 3D shape [x, y, z]");
185 }
186 dims.push_back(DataDimension::spatial(shape[0], 'x', strides[0]));
187 dims.push_back(DataDimension::spatial(shape[1], 'y', strides[1]));
188 dims.push_back(DataDimension::spatial(shape[2], 'z', strides[2]));
189 break;
190
192 if (shape.size() != 3) {
193 error<std::invalid_argument>(
196 std::source_location::current(),
197 "VIDEO_GRAYSCALE requires 3D shape [frames, height, width]");
198 }
199 dims.push_back(DataDimension::time(shape[0], "frames"));
200 dims.push_back(DataDimension::spatial(shape[1], 'y', strides[1]));
201 dims.push_back(DataDimension::spatial(shape[2], 'x', strides[2]));
202 break;
203
205 if (shape.size() != 4) {
206 error<std::invalid_argument>(
209 std::source_location::current(),
210 "VIDEO_COLOR requires 4D shape [frames, height, width, channels]");
211 }
212 dims.push_back(DataDimension::time(shape[0], "frames"));
213 dims.push_back(DataDimension::spatial(shape[1], 'y', strides[1]));
214 dims.push_back(DataDimension::spatial(shape[2], 'x', strides[2]));
215 dims.push_back(DataDimension::channel(shape[3], strides[3]));
216 break;
217
218 default:
219 error<std::invalid_argument>(
222 std::source_location::current(),
223 "Unsupported modality for dimension creation: {}", modality_to_string(modality));
224 }
225
226 return dims;
227}
228
230 const std::vector<uint64_t>& shape,
231 MemoryLayout layout)
232{
233 if (shape.empty())
234 return {};
235
236 std::vector<uint64_t> strides(shape.size());
237
238 if (layout == MemoryLayout::ROW_MAJOR) {
239 auto reversed_shape = shape | std::views::reverse;
240 std::exclusive_scan(
241 reversed_shape.begin(),
242 reversed_shape.end(),
243 strides.rbegin(),
244 uint64_t(1),
245 std::multiplies<uint64_t> {});
246 } else {
247 std::exclusive_scan(
248 shape.begin(),
249 shape.end(),
250 strides.begin(),
251 uint64_t(1),
252 std::multiplies<uint64_t> {});
253 }
254
255 return strides;
256}
257
258}
Eigen::Index count
@ Runtime
General runtime operations (default fallback)
@ Kakshya
Containers[Signalsource, Stream, File], Regions, DataProcessors.
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:83
constexpr std::string_view enum_to_string(EnumType value) noexcept
Universal enum to string converter using magic_enum (original case)
Grouping information for sub-dimensions.
Definition NDData.hpp:170
static DataDimension spatial_2d(uint64_t width, uint64_t height)
Convenience constructor for a 2D spatial dimension.
Definition NDData.cpp:57
Role
Semantic role of the dimension.
Definition NDData.hpp:146
@ 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:190
std::string name
Human-readable identifier for the dimension.
Definition NDData.hpp:188
static DataDimension vertex_positions(uint64_t count)
Create dimension for vertex positions (vec3)
Definition NDData.cpp:88
uint64_t size
Number of elements in this dimension.
Definition NDData.hpp:189
static DataDimension vertex_colors(uint64_t count, bool has_alpha=false)
Create dimension for colors (vec3 or vec4)
Definition NDData.cpp:103
Role role
Semantic hint for common operations.
Definition NDData.hpp:191
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:32
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:72
static DataDimension vertex_normals(uint64_t count)
Create dimension for vertex normals (vec3)
Definition NDData.cpp:93
static DataDimension frequency(uint64_t bins, std::string name="frequency")
Convenience constructor for a frequency dimension.
Definition NDData.cpp:27
static DataDimension spatial_1d(uint64_t width)
Convenience constructor for an array dimension.
Definition NDData.cpp:52
static DataDimension time(uint64_t samples, std::string name="time")
Convenience constructor for a temporal (time) dimension.
Definition NDData.cpp:17
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:229
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
static DataDimension mipmap_levels(uint64_t levels)
Create dimension for mipmap levels.
Definition NDData.cpp:67
static DataDimension texture_coords(uint64_t count)
Create dimension for texture coordinates (vec2)
Definition NDData.cpp:98
static DataDimension spatial_3d(uint64_t width, uint64_t height, uint64_t depth)
Convenience constructor for a 3D spatial dimension.
Definition NDData.cpp:62
std::optional< ComponentGroup > grouping
Definition NDData.hpp:186
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:139