MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
NDData.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <glm/glm.hpp>
4
5namespace MayaFlux::Kakshya {
6
7/**
8 * @enum GpuDataFormat
9 * @brief GPU data formats with explicit precision levels
10 */
11enum class GpuDataFormat : uint8_t {
12 FLOAT32, // 32-bit float (standard GPU)
13 VEC2_F32, // glm::vec2 (32-bit components)
14 VEC3_F32, // glm::vec3 (32-bit components) — not a sampled image format
15 VEC4_F32, // glm::vec4 (32-bit components)
16
17 FLOAT64, // 64-bit double (audio precision)
18 VEC2_F64, // glm::dvec2 (64-bit components)
19 VEC3_F64, // glm::dvec3 (64-bit components)
20 VEC4_F64, // glm::dvec4 (64-bit components)
21
22 INT32,
23 UINT32,
24
25 UINT8, // uint8_t — R8 / RGBA8 texel data
26 UINT16, // uint16_t — R16F raw half-float storage, packed formats
27};
28
29/**
30 * @brief Memory layout for multi-dimensional data.
31 *
32 * Specifies how multi-dimensional data is mapped to linear memory.
33 * - ROW_MAJOR: Last dimension varies fastest (C/C++ style).
34 * - COLUMN_MAJOR: First dimension varies fastest (Fortran/MATLAB style).
35 *
36 * This abstraction enables flexible, efficient access patterns for
37 * digital-first, data-driven workflows, unconstrained by analog conventions.
38 */
39enum class MemoryLayout : uint8_t {
40 ROW_MAJOR, ///< C/C++ style (last dimension varies fastest)
41 COLUMN_MAJOR ///< Fortran/MATLAB style (first dimension varies fastest)
42};
43
44/**
45 * @brief Data organization strategy for multi-channel/multi-frame data.
46 *
47 * Determines how logical units (channels, frames) are stored in memory.
48 */
49enum class OrganizationStrategy : uint8_t {
50 INTERLEAVED, ///< Single DataVariant with interleaved data (LRLRLR for stereo)
51 PLANAR, ///< Separate DataVariant per logical unit (LLL...RRR for stereo)
52 HYBRID, ///< Mixed approach based on access patterns
53 USER_DEFINED ///< Custom organization
54};
55
56/**
57 * @brief Multi-type data storage for different precision needs.
58 *
59 * DataVariant enables containers to store and expose data in the most
60 * appropriate format for the application, supporting high-precision,
61 * standard-precision, integer, and complex types. This abstraction
62 * is essential for digital-first, data-driven processing pipelines.
63 */
64using DataVariant = std::variant<
65 std::vector<double>, ///< High precision floating point
66 std::vector<float>, ///< Standard precision floating point
67 std::vector<uint8_t>, ///< 8-bit data (images, compressed audio)
68 std::vector<uint16_t>, ///< 16-bit data (CD audio, images)
69 std::vector<uint32_t>, ///< 32-bit data (high precision int)
70 std::vector<std::complex<float>>, ///< Complex data (spectral)
71 std::vector<std::complex<double>>, ///< High precision complex
72 std::vector<glm::vec2>, ///< 2D vector data
73 std::vector<glm::vec3>, ///< 3D vector data
74 std::vector<glm::vec4>, ///< 4D vector data
75 std::vector<glm::mat4> ///< 4x4 matrix data
76 >;
77
78/**
79 * @brief Data modality types for cross-modal analysis
80 */
81enum class DataModality : uint8_t {
82 AUDIO_1D, ///< 1D audio signal
83 AUDIO_MULTICHANNEL, ///< Multi-channel audio
84 IMAGE_2D, ///< 2D image (grayscale or single channel)
85 IMAGE_COLOR, ///< 2D RGB/RGBA image
86 VIDEO_GRAYSCALE, ///< 3D video (time + 2D grayscale)
87 VIDEO_COLOR, ///< 4D video (time + 2D + color)
88 TEXTURE_2D, ///< 2D texture data
89 TENSOR_ND, ///< N-dimensional tensor
90 SPECTRAL_2D, ///< 2D spectral data (time + frequency)
91 VOLUMETRIC_3D, ///< 3D volumetric data
92 VERTICES_3D, ///< 3D vertex data (positions, normals, etc.)
93 VERTEX_POSITIONS_3D, // glm::vec3 - vertex positions
94 VERTEX_NORMALS_3D, // glm::vec3 - vertex normals
95 VERTEX_TANGENTS_3D, // glm::vec3 - tangent vectors
96 VERTEX_COLORS_RGB, // glm::vec3 - RGB colors
97 VERTEX_COLORS_RGBA, // glm::vec4 - RGBA colors
98 TEXTURE_COORDS_2D, // glm::vec2 - UV coordinates
99 TRANSFORMATION_MATRIX, // glm::mat4 - transform matrices
100 SCALAR_F32, ///< Single-channel float data
101 UNKNOWN ///< Unknown or undefined modality
102};
103
104/**
105 * @brief Convert DataModality enum to string representation.
106 * @param modality DataModality value
107 * @return String view of the modality name
108 */
109std::string_view modality_to_string(DataModality modality);
110
111/**
112 * @brief Check if a modality represents structured data (vectors, matrices).
113 * @param modality DataModality value
114 * @return True if structured, false otherwise
115 */
117{
118 switch (modality) {
126 return true;
127 default:
128 return false;
129 }
130}
131
132/**
133 * @brief Minimal dimension descriptor focusing on structure only.
134 *
135 * DataDimension describes a single axis of an N-dimensional dataset,
136 * providing semantic hints (such as TIME, CHANNEL, SPATIAL_X, etc.)
137 * and structural information (name, size, stride).
138 *
139 * This abstraction enables containers to describe arbitrary data
140 * organizations, supporting digital-first, data-driven processing
141 * without imposing analog metaphors (e.g., "track", "tape", etc.).
142 */
143struct MAYAFLUX_API DataDimension {
144 /**
145 * @brief Semantic role of the dimension.
146 *
147 * Used to indicate the intended interpretation of the dimension,
148 * enabling generic algorithms to adapt to data structure.
149 */
150 enum class Role : uint8_t {
151 TIME, ///< Temporal progression (samples, frames, steps)
152 CHANNEL, ///< Parallel streams (audio channels, color channels)
153 SPATIAL_X, ///< Spatial X axis (images, tensors)
154 SPATIAL_Y, ///< Spatial Y axis
155 SPATIAL_Z, ///< Spatial Z axis
156 FREQUENCY, ///< Spectral/frequency axis
157 POSITION, ///< Vertex positions (3D space)
158 NORMAL, ///< Surface normals
159 TANGENT, ///< Tangent vectors
160 BITANGENT, ///< Bitangent vectors
161 UV, ///< Texture coordinates
162 COLOR, ///< Color data (RGB/RGBA)
163 INDEX, ///< Index buffer data
164 MIP_LEVEL, ///< Mipmap levels
165 CUSTOM ///< User-defined or application-specific
166 };
167
168 /**
169 * @brief Grouping information for sub-dimensions.
170 *
171 * Used to indicate that this dimension is composed of groups
172 * of sub-dimensions (e.g., color channels grouped per pixel).
173 */
175 uint8_t count;
176 uint8_t offset;
177
179 : count(0)
180 , offset(0)
181 {
182 }
183 ComponentGroup(uint8_t c, uint8_t o = 0)
184 : count(c)
185 , offset(o)
186 {
187 }
188 };
189
190 std::optional<ComponentGroup> grouping;
191
192 std::string name; ///< Human-readable identifier for the dimension
193 uint64_t size {}; ///< Number of elements in this dimension
194 uint64_t stride {}; ///< Memory stride (elements between consecutive indices)
195 Role role = Role::CUSTOM; ///< Semantic hint for common operations
196
197 DataDimension() = default;
198
199 /**
200 * @brief Construct a dimension descriptor.
201 * @param n Name of the dimension
202 * @param s Size (number of elements)
203 * @param st Stride (default: 1)
204 * @param r Semantic role (default: CUSTOM)
205 */
206 DataDimension(std::string n, uint64_t s, uint64_t st = 1, Role r = Role::CUSTOM);
207
208 /**
209 * @brief Convenience constructor for a temporal (time) dimension.
210 * @param samples Number of samples/frames
211 * @param name Optional name (default: "time")
212 * @return DataDimension representing time
213 */
214 static DataDimension time(uint64_t samples, std::string name = "time");
215
216 /**
217 * @brief Convenience constructor for a channel dimension.
218 * @param count Number of channels
219 * @param stride Memory stride (default: 1)
220 * @return DataDimension representing channels
221 */
222 static DataDimension channel(uint64_t count, uint64_t stride = 1);
223
224 /**
225 * @brief Convenience constructor for a frequency dimension.
226 * @param bins Number of frequency bins
227 * @param name Optional name (default: "frequency")
228 * @return DataDimension representing frequency
229 */
230 static DataDimension frequency(uint64_t bins, std::string name = "frequency");
231
232 /**
233 * @brief Convenience constructor for a spatial dimension.
234 * @param size Number of elements along this axis
235 * @param axis Axis character ('x', 'y', or 'z')
236 * @param stride Memory stride (default: 1)
237 * @param name Optional name (default: "pixels")
238 * @return DataDimension representing a spatial axis
239 */
240 static DataDimension spatial(uint64_t size, char axis, uint64_t stride = 1, std::string name = "spatial");
241
242 /**
243 * @brief Convenience constructor for an array dimension.
244 * @param count Number of array elements
245 * @param name Optional name (default: "array")
246 * @return DataDimension representing an array
247 */
248 static DataDimension spatial_1d(uint64_t width);
249
250 /**
251 * @brief Convenience constructor for a 2D spatial dimension.
252 * @param width Width in elements
253 * @param height Height in elements
254 * @return DataDimension representing 2D spatial data
255 */
256 static DataDimension spatial_2d(uint64_t width, uint64_t height);
257
258 /**
259 * @brief Convenience constructor for a 3D spatial dimension.
260 * @param width Width in elements
261 * @param height Height in elements
262 * @param depth Depth in elements
263 * @return DataDimension representing 3D spatial data
264 */
265 static DataDimension spatial_3d(uint64_t width, uint64_t height, uint64_t depth);
266
267 /**
268 * @brief Create dimension with component grouping
269 * @param name Dimension name
270 * @param element_count Number of elements (not components)
271 * @param components_per_element Components per element (e.g., 3 for vec3)
272 * @param role Semantic role
273 */
274 static DataDimension grouped(std::string name, uint64_t element_count, uint8_t components_per_element, Role role = Role::CUSTOM);
275
276 /**
277 * @brief Create dimension for vertex positions (vec3)
278 */
279 static DataDimension vertex_positions(uint64_t count);
280
281 /**
282 * @brief Create dimension for vertex normals (vec3)
283 */
284 static DataDimension vertex_normals(uint64_t count);
285
286 /**
287 * @brief Create dimension for texture coordinates (vec2)
288 */
289 static DataDimension texture_coords(uint64_t count);
290
291 /**
292 * @brief Create dimension for colors (vec3 or vec4)
293 */
294 static DataDimension vertex_colors(uint64_t count, bool has_alpha = false);
295
296 /**
297 * @brief Create dimension for mipmap levels.
298 */
299 static DataDimension mipmap_levels(uint64_t levels);
300
301 /**
302 * @brief Data container combining variants and dimensions.
303 */
304 using DataModule = std::pair<std::vector<DataVariant>, std::vector<DataDimension>>;
305
306 /**
307 * @brief Create data module for a specific modality.
308 * @tparam T Data type for storage
309 * @param modality Target data modality
310 * @param shape Dimensional sizes
311 * @param default_value Initial value for elements
312 * @param layout Memory layout strategy
313 * @param strategy Organization strategy
314 * @return DataModule with appropriate structure
315 */
316 template <typename T>
318 DataModality modality,
319 const std::vector<uint64_t>& shape,
320 T default_value = T {},
321 MemoryLayout layout = MemoryLayout::ROW_MAJOR,
322 OrganizationStrategy strategy = OrganizationStrategy::PLANAR)
323 {
324 auto dims = create_dimensions(modality, shape, layout);
325 auto variants = create_variants(modality, shape, default_value, strategy);
326
327 return { std::move(variants), std::move(dims) };
328 }
329
330 /**
331 * @brief Create dimension descriptors for a data modality.
332 * @param modality Target data modality
333 * @param shape Dimensional sizes
334 * @param layout Memory layout strategy
335 * @return Vector of DataDimension objects
336 */
337 static std::vector<DataDimension> create_dimensions(
338 DataModality modality,
339 const std::vector<uint64_t>& shape,
340 MemoryLayout layout = MemoryLayout::ROW_MAJOR);
341
342 /**
343 * @brief Create 1D audio data module.
344 * @tparam T Data type for storage
345 * @param samples Number of audio samples
346 * @param default_value Initial value for elements
347 * @return DataModule for 1D audio
348 */
349 template <typename T>
350 static DataModule create_audio_1d(uint64_t samples, T default_value = T {})
351 {
352 return create_for_modality(DataModality::AUDIO_1D, { samples }, default_value);
353 }
354
355 /**
356 * @brief Create multi-channel audio data module.
357 * @tparam T Data type for storage
358 * @param samples Number of audio samples
359 * @param channels Number of audio channels
360 * @param default_value Initial value for elements
361 * @return DataModule for multi-channel audio
362 */
363 template <typename T>
364 static DataModule create_audio_multichannel(uint64_t samples, uint64_t channels, T default_value = T {})
365 {
366 return create_for_modality(DataModality::AUDIO_MULTICHANNEL, { samples, channels }, default_value);
367 }
368
369 /**
370 * @brief Create 2D image data module.
371 * @tparam T Data type for storage
372 * @param height Image height in pixels
373 * @param width Image width in pixels
374 * @param default_value Initial value for elements
375 * @return DataModule for 2D image
376 */
377 template <typename T>
378 static DataModule create_image_2d(uint64_t height, uint64_t width, T default_value = T {})
379 {
380 return create_for_modality(DataModality::IMAGE_2D, { height, width }, default_value);
381 }
382
383 /**
384 * @brief Create 2D spectral data module.
385 * @tparam T Data type for storage
386 * @param time_windows Number of time windows
387 * @param frequency_bins Number of frequency bins
388 * @param default_value Initial value for elements
389 * @return DataModule for spectral data
390 */
391 template <typename T>
392 static DataModule create_spectral_2d(uint64_t time_windows, uint64_t frequency_bins, T default_value = T {})
393 {
394 return create_for_modality(DataModality::SPECTRAL_2D, { time_windows, frequency_bins }, default_value);
395 }
396
397 /**
398 * @brief Calculate memory strides based on shape and layout.
399 * @param shape Dimensional sizes
400 * @param layout Memory layout strategy
401 * @return Vector of stride values for each dimension
402 */
403 static std::vector<uint64_t> calculate_strides(
404 const std::vector<uint64_t>& shape,
405 MemoryLayout layout);
406
407private:
408 /**
409 * @brief Create data variants for a specific modality.
410 * @tparam T Data type for storage
411 * @param modality Target data modality
412 * @param shape Dimensional sizes
413 * @param default_value Initial value for elements
414 * @param org Organization strategy
415 * @return Vector of DataVariant objects
416 */
417 template <typename T>
418 static std::vector<DataVariant> create_variants(
419 DataModality modality,
420 const std::vector<uint64_t>& shape,
421 T default_value,
422 OrganizationStrategy org = OrganizationStrategy::PLANAR)
423 {
424 std::vector<DataVariant> variants;
425
426 if (org == OrganizationStrategy::INTERLEAVED) {
427 uint64_t total = std::accumulate(shape.begin(), shape.end(), uint64_t(1), std::multiplies<>());
428 variants.emplace_back(std::vector<T>(total, default_value));
429 return variants;
430 }
431
432 switch (modality) {
433 case DataModality::AUDIO_1D:
434 variants.emplace_back(std::vector<T>(shape[0], default_value));
435 break;
436
437 case DataModality::AUDIO_MULTICHANNEL: {
438 uint64_t samples = shape[0];
439 uint64_t channels = shape[1];
440 variants.reserve(channels);
441 for (uint64_t ch = 0; ch < channels; ++ch) {
442 variants.emplace_back(std::vector<T>(samples, default_value));
443 }
444 break;
445 }
446
447 case DataModality::IMAGE_2D:
448 variants.emplace_back(std::vector<T>(shape[0] * shape[1], default_value));
449 break;
450
451 case DataModality::IMAGE_COLOR: {
452 uint64_t height = shape[0];
453 uint64_t width = shape[1];
454 uint64_t channels = shape[2];
455 uint64_t pixels = height * width;
456 variants.reserve(channels);
457 for (uint64_t ch = 0; ch < channels; ++ch) {
458 variants.emplace_back(std::vector<T>(pixels, default_value));
459 }
460 break;
461 }
462
463 case DataModality::SPECTRAL_2D:
464 variants.emplace_back(std::vector<T>(shape[0] * shape[1], default_value));
465 break;
466
467 case DataModality::VOLUMETRIC_3D:
468 variants.emplace_back(std::vector<T>(shape[0] * shape[1] * shape[2], default_value));
469 break;
470
471 case DataModality::VIDEO_GRAYSCALE: {
472 uint64_t frames = shape[0];
473 uint64_t height = shape[1];
474 uint64_t width = shape[2];
475 uint64_t frame_size = height * width;
476 variants.reserve(frames);
477 for (uint64_t f = 0; f < frames; ++f) {
478 variants.emplace_back(std::vector<T>(frame_size, default_value));
479 }
480 break;
481 }
482
483 case DataModality::VIDEO_COLOR: {
484 uint64_t frames = shape[0];
485 uint64_t height = shape[1];
486 uint64_t width = shape[2];
487 uint64_t channels = shape[3];
488 uint64_t frame_size = height * width;
489 variants.reserve(frames * channels);
490 for (uint64_t f = 0; f < frames; ++f) {
491 for (uint64_t ch = 0; ch < channels; ++ch) {
492 variants.emplace_back(std::vector<T>(frame_size, default_value));
493 }
494 }
495 break;
496 }
497
498 default:
499 uint64_t total = std::accumulate(shape.begin(), shape.end(), uint64_t(1), std::multiplies<>());
500 variants.emplace_back(std::vector<T>(total, default_value));
501 break;
502 }
503
504 return variants;
505 }
506};
507
508} // namespace MayaFlux::Kakshya
uint32_t width
Definition Decoder.cpp:59
const std::vector< float > * pixels
Definition Decoder.cpp:58
double frequency
size_t count
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:76
DataModality
Data modality types for cross-modal analysis.
Definition NDData.hpp:81
@ AUDIO_MULTICHANNEL
Multi-channel audio.
@ SPECTRAL_2D
2D spectral data (time + frequency)
@ UNKNOWN
Unknown or undefined modality.
@ VERTICES_3D
3D vertex data (positions, normals, etc.)
@ SCALAR_F32
Single-channel float data.
@ VOLUMETRIC_3D
3D volumetric data
@ VIDEO_GRAYSCALE
3D video (time + 2D grayscale)
@ VIDEO_COLOR
4D video (time + 2D + color)
@ TENSOR_ND
N-dimensional tensor.
@ IMAGE_COLOR
2D RGB/RGBA image
@ IMAGE_2D
2D image (grayscale or single channel)
MemoryLayout
Memory layout for multi-dimensional data.
Definition NDData.hpp:39
@ ROW_MAJOR
C/C++ style (last dimension varies fastest)
@ COLUMN_MAJOR
Fortran/MATLAB style (first dimension varies fastest)
OrganizationStrategy
Data organization strategy for multi-channel/multi-frame data.
Definition NDData.hpp:49
@ HYBRID
Mixed approach based on access patterns.
@ PLANAR
Separate DataVariant per logical unit (LLL...RRR for stereo)
@ INTERLEAVED
Single DataVariant with interleaved data (LRLRLR for stereo)
bool is_structured_modality(DataModality modality)
Check if a modality represents structured data (vectors, matrices).
Definition NDData.hpp:116
GpuDataFormat
GPU data formats with explicit precision levels.
Definition NDData.hpp:11
std::string_view modality_to_string(DataModality modality)
Convert DataModality enum to string representation.
Definition NDData.cpp:83
Grouping information for sub-dimensions.
Definition NDData.hpp:174
static DataModule create_audio_multichannel(uint64_t samples, uint64_t channels, T default_value=T {})
Create multi-channel audio data module.
Definition NDData.hpp:364
Role
Semantic role of the dimension.
Definition NDData.hpp:150
static DataModule create_spectral_2d(uint64_t time_windows, uint64_t frequency_bins, T default_value=T {})
Create 2D spectral data module.
Definition NDData.hpp:392
std::string name
Human-readable identifier for the dimension.
Definition NDData.hpp:192
static DataModule create_audio_1d(uint64_t samples, T default_value=T {})
Create 1D audio data module.
Definition NDData.hpp:350
static DataModule create_image_2d(uint64_t height, uint64_t width, T default_value=T {})
Create 2D image data module.
Definition NDData.hpp:378
std::pair< std::vector< DataVariant >, std::vector< DataDimension > > DataModule
Data container combining variants and dimensions.
Definition NDData.hpp:304
static std::vector< DataVariant > create_variants(DataModality modality, const std::vector< uint64_t > &shape, T default_value, OrganizationStrategy org=OrganizationStrategy::PLANAR)
Create data variants for a specific modality.
Definition NDData.hpp:418
static DataModule create_for_modality(DataModality modality, const std::vector< uint64_t > &shape, T default_value=T {}, MemoryLayout layout=MemoryLayout::ROW_MAJOR, OrganizationStrategy strategy=OrganizationStrategy::PLANAR)
Create data module for a specific modality.
Definition NDData.hpp:317
std::optional< ComponentGroup > grouping
Definition NDData.hpp:190
Minimal dimension descriptor focusing on structure only.
Definition NDData.hpp:143