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