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