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