MayaFlux 1.0.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
NDimensionalContainer.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "NDData/NDData.hpp"
4
5namespace MayaFlux::Kakshya {
6
7/**
8 * @brief Forward declarations for region structures used in N-dimensional data containers.
9 */
10struct Region;
11struct RegionGroup;
12struct RegionSegment;
13
14/**
15 * @brief Container structure for consistent dimension ordering.
16 *
17 * Provides standard indices and layout structures for common data types,
18 * supporting digital-first, data-driven workflows. These structures are
19 * not tied to analog metaphors, but instead facilitate generic, flexible
20 * processing of multi-dimensional data.
21 */
22struct MAYAFLUX_API ContainerDataStructure {
23
24 // Image/Video structures
25 // static constexpr size_t FRAME_DIM = 0;
26 // static constexpr size_t COLOR_DIM = 3;
27
28 // Spectral structures
29 // static constexpr size_t TIME_WINDOW_DIM = 0;
30
31 std::vector<DataDimension> dimensions;
32
33 std::optional<size_t> time_dims;
34 std::optional<size_t> channel_dims;
35 std::optional<size_t> height_dims;
36 std::optional<size_t> width_dims;
37 std::optional<size_t> frequency_dims;
38
39 DataModality modality {};
40 MemoryLayout memory_layout = MemoryLayout::ROW_MAJOR;
41 OrganizationStrategy organization = OrganizationStrategy::PLANAR;
42
43 /**
44 * @brief Construct a container structure with specified parameters.
45 * @param mod Data modality type
46 * @param org Organization strategy (default: PLANAR)
47 * @param layout Memory layout (default: ROW_MAJOR)
48 */
50 OrganizationStrategy org = OrganizationStrategy::PLANAR,
51 MemoryLayout layout = MemoryLayout::ROW_MAJOR);
52
54
55 /**
56 * @brief Get the expected dimension roles for this structure's modality.
57 * @return Vector of dimension roles in order
58 */
59 [[nodiscard]] std::vector<DataDimension::Role> get_expected_dimension_roles() const;
60
61 /**
62 * @brief Create structure for planar audio data.
63 * @return Containerstructure configured for planar audio
64 */
65 static ContainerDataStructure audio_planar();
66
67 /**
68 * @brief Create structure for interleaved audio data.
69 * @return Containerstructure configured for interleaved audio
70 */
71 static ContainerDataStructure audio_interleaved();
72
73 /**
74 * @brief Create structure for planar image data.
75 * @return Containerstructure configured for planar images
76 */
77 static ContainerDataStructure image_planar();
78
79 /**
80 * @brief Create structure for interleaved image data.
81 * @return Containerstructure configured for interleaved images
82 */
83 static ContainerDataStructure image_interleaved();
84
85 /**
86 * @brief Calculate expected number of data variants for given dimensions.
87 * @param dimensions Vector of dimension descriptors
88 * @return Expected number of DataVariant objects needed
89 */
90 [[nodiscard]] size_t get_expected_variant_count(const std::vector<DataDimension>& dimensions) const;
91
92 /**
93 * @brief Calculate size of a specific variant in the organization.
94 * @param dimensions Vector of dimension descriptors
95 * @param modality Data modality type
96 * @param organization Organization strategy
97 * @param variant_index Index of the variant (0-based)
98 * @return Number of elements in the specified variant
99 */
100 [[nodiscard]] static uint64_t get_variant_size(const std::vector<DataDimension>& dimensions,
101 DataModality modality, OrganizationStrategy organization, size_t variant_index = 0);
102 [[nodiscard]] uint64_t get_variant_size() const { return get_variant_size(dimensions, modality, organization); }
103
104 /**
105 * @brief Validate that dimensions match this structure's expectations.
106 * @param dimensions Vector of dimension descriptors to validate
107 * @return true if dimensions are valid for this structure
108 */
109 [[nodiscard]] bool validate_dimensions(const std::vector<DataDimension>& dimensions) const;
110
111 /**
112 * @brief Find the index of a dimension with the specified role.
113 * @param dimensions Vector of dimension descriptors to search
114 * @param role Dimension role to find
115 * @return Index of the dimension with the specified role
116 */
117 [[nodiscard]] size_t get_dimension_index_for_role(const std::vector<DataDimension>& dimensions,
118 DataDimension::Role role) const;
119
120 /**
121 * @brief Get total elements across all dimensions.
122 * @param dimensions Vector of dimension descriptors
123 * @return Total number of elements
124 */
125 [[nodiscard]] static uint64_t get_total_elements(const std::vector<DataDimension>& dimensions);
126 [[nodiscard]] uint64_t get_total_elements() const { return get_total_elements(dimensions); }
127
128 /**
129 * @brief Get total number of components (channels, spatial, frequency).
130 * @param dimensions Vector of dimension descriptors
131 * @return Total number of components
132 */
133 [[nodiscard]] static uint64_t get_component_count(const std::vector<DataDimension>& dimensions);
134 [[nodiscard]] uint64_t get_component_count() const { return get_component_count(dimensions); }
135
136 /**
137 * @brief Extract sample count from dimensions.
138 * @param dimensions Vector of dimension descriptors
139 * @return Number of samples in the temporal dimension
140 */
141 [[nodiscard]] static uint64_t get_samples_count(const std::vector<DataDimension>& dimensions);
142 [[nodiscard]] uint64_t get_samples_count() const { return get_samples_count(dimensions); }
143
144 /**
145 * @brief Get samples per channel (time dimension only).
146 * @param dimensions Vector of dimension descriptors
147 * @return Number of samples per channel
148 */
149 [[nodiscard]] static uint64_t get_samples_count_per_channel(const std::vector<DataDimension>& dimensions);
150 [[nodiscard]] uint64_t get_samples_count_per_channel() const { return get_samples_count_per_channel(dimensions); }
151
152 /**
153 * @brief Extract channel count from dimensions.
154 * @param dimensions Vector of dimension descriptors
155 * @return Number of channels
156 */
157 [[nodiscard]] static uint64_t get_channel_count(const std::vector<DataDimension>& dimensions);
158 [[nodiscard]] uint64_t get_channel_count() const { return get_channel_count(dimensions); }
159
160 /**
161 * @brief Get pixel count (spatial dimensions only).
162 * @param dimensions Vector of dimension descriptors
163 * @return Number of pixels
164 */
165 [[nodiscard]] static uint64_t get_pixels_count(const std::vector<DataDimension>& dimensions);
166 [[nodiscard]] uint64_t get_pixels_count() const { return get_pixels_count(dimensions); }
167
168 /**
169 * @brief Extract height from image/video dimensions.
170 * @param dimensions Vector of dimension descriptors
171 * @return Height in pixels
172 */
173 [[nodiscard]] static uint64_t get_height(const std::vector<DataDimension>& dimensions);
174 [[nodiscard]] uint64_t get_height() const { return get_height(dimensions); }
175
176 /**
177 * @brief Extract width from image/video dimensions.
178 * @param dimensions Vector of dimension descriptors
179 * @return Width in pixels
180 */
181 [[nodiscard]] static uint64_t get_width(const std::vector<DataDimension>& dimensions);
182 [[nodiscard]] uint64_t get_width() const { return get_width(dimensions); }
183
184 /**
185 * @brief Extract frame count from video dimensions.
186 * @param dimensions Vector of dimension descriptors
187 * @return Number of frames
188 */
189 [[nodiscard]] static size_t get_frame_count(const std::vector<DataDimension>& dimensions);
190 [[nodiscard]] size_t get_frame_count() const { return get_frame_count(dimensions); }
191
192 /**
193 * @brief Extract the size of non time dimensions (channel, spatial, frequency)
194 * @param dimensions Vector of dimension descriptors
195 * @return cumulative size of non time dimensions
196 */
197 [[nodiscard]] static size_t get_frame_size(const std::vector<DataDimension>& dimensions);
198 [[nodiscard]] size_t get_frame_size() const { return get_frame_size(dimensions); }
199};
200
201/**
202 * @class NDDataContainer
203 * @tparam T Element type of region data.
204 * @brief Abstract interface for N-dimensional data containers.
205 *
206 * NDDataContainer provides a dimension-agnostic API for accessing and manipulating
207 * multi-dimensional data (audio, video, tensors, etc). It is designed for digital-first,
208 * data-driven workflows, enabling flexible, efficient, and generic processing of
209 * structured data without imposing analog metaphors or legacy constraints.
210 *
211 * Key features:
212 * - Arbitrary dimension support (not limited to 2D or 3D)
213 * - Explicit memory layout control (row-major/column-major)
214 * - Region-based access for efficient subsetting and streaming
215 * - Thread-safe locking for concurrent processing
216 * - Support for multiple data types and precisions
217 * - Designed for composability with processors, buffers, and computational nodes
218 *
219 * This interface is the foundation for all high-level data containers in Maya Flux,
220 * enabling advanced workflows such as real-time streaming, offline analysis, and
221 * hybrid computational models.
222 */
223template <typename T>
224class MAYAFLUX_API NDDataContainer {
225public:
226 virtual ~NDDataContainer() = default;
227
228 /**
229 * @brief Get the dimensions describing the structure of the data.
230 * @return Vector of DataDimension objects (one per axis)
231 */
232 [[nodiscard]] virtual std::vector<DataDimension> get_dimensions() const = 0;
233
234 /**
235 * @brief Get the total number of elements in the container.
236 * @return Product of all dimension sizes
237 */
238 [[nodiscard]] virtual uint64_t get_total_elements() const = 0;
239
240 /**
241 * @brief Get the memory layout used by this container.
242 * @return Current memory layout (row-major or column-major)
243 */
244 [[nodiscard]] virtual MemoryLayout get_memory_layout() const = 0;
245
246 /**
247 * @brief Set the memory layout for this container.
248 * @param layout New memory layout to use
249 * @note May trigger data reorganization if implementation supports both layouts
250 */
251 virtual void set_memory_layout(MemoryLayout layout) = 0;
252
253 /**
254 * @brief Get the number of elements that constitute one "frame".
255 * For audio: channels per sample. For images: pixels per frame.
256 * @return Number of elements per frame
257 */
258 [[nodiscard]] virtual uint64_t get_frame_size() const = 0;
259
260 /**
261 * @brief Get the number of frames in the primary (temporal) dimension.
262 * @return Number of frames
263 */
264 [[nodiscard]] virtual uint64_t get_num_frames() const = 0;
265
266 /**
267 * @brief Get data for a specific region.
268 * @param region The region to extract data from
269 * @return Vector containing the region's data
270 */
271 [[nodiscard]] virtual std::vector<T> get_region_data(const Region& region) const = 0;
272
273 /**
274 * @brief Get data for multiple regions efficiently.
275 * @param regions Vector of regions to extract data from
276 * @return Region data in the container's element type
277 */
278 [[nodiscard]] virtual std::vector<T> get_region_group_data(const RegionGroup& regions) const = 0;
279
280 /**
281 * @brief Get data for multiple region segments efficiently.
282 * @param segments Vector of region segments to extract data from
283 * @return Segment data in the container's element type
284 */
285 [[nodiscard]] virtual std::vector<T> get_segments_data(const std::vector<RegionSegment>& segments) const = 0;
286
287 /**
288 * @brief Set data for a specific region.
289 * @param region The region to write data to
290 * @param data The data to write
291 */
292 virtual void set_region_data(const Region& region, const std::vector<T>& data) = 0;
293
294 /**
295 * @brief Get a single frame of data efficiently.
296 * @param frame_index Index of the frame (in the temporal dimension)
297 * @return Span of data representing one complete frame
298 */
299 [[nodiscard]] auto get_frame(uint64_t frame_index) const -> FrameView
300 {
301 return FrameView(get_frame_span_impl(frame_index));
302 }
303
304 /**
305 * @brief Get multiple frames efficiently.
306 * @param output Buffer to write frames into
307 * @param start_frame First frame index
308 * @param num_frames Number of frames to retrieve
309 */
310 template <DataVariantElement ValueT>
311 void get_frames(std::span<ValueT> output, uint64_t start_frame, uint64_t num_frames) const
312 {
313 get_frames_impl(output.data(), output.size(), start_frame, num_frames, typeid(ValueT));
314 }
315
316 /**
317 * @brief Get a single frame of data as a typed span.
318 * @tparam ValueT Element type to interpret the frame data as
319 * @param frame_index Index of the frame (in the temporal dimension)
320 * @return Span of data representing one complete frame, interpreted as ValueT
321 */
322 template <DataVariantElement ValueT>
323 [[nodiscard]] auto get_frame_as(uint64_t frame_index) const -> std::span<const ValueT>
324 {
325 return get_frame(frame_index).template as<ValueT>();
326 }
327
328 /**
329 * @brief Get multiple frames efficiently as a typed span.
330 *
331 * Convenience wrapper over get_frames() for callers that know the element
332 * type statically but hold the output buffer as a plain vector rather than
333 * a typed span. Deduces ValueT from the vector element type; no visitor, no
334 * type query needed at the call site.
335 *
336 * @tparam ValueT Element type. Must satisfy DataVariantElement and match the
337 * container's native element type. The impl silently no-ops or
338 * errors on mismatch depending on the container.
339 * @param output Destination vector. Resized to num_frames * frame_size
340 * by the caller before passing; content is overwritten.
341 * @param start_frame First frame index.
342 * @param num_frames Number of frames to retrieve.
343 */
344 template <DataVariantElement ValueT>
345 void get_frames_as(std::vector<ValueT>& output, uint64_t start_frame, uint64_t num_frames) const
346 {
347 get_frames_impl(output.data(), output.size(), start_frame, num_frames, typeid(ValueT));
348 }
349
350 /**
351 * @brief Runtime query for the native scalar element type of this container.
352 *
353 * Mirrors FrameView::element_type(). Typical return values:
354 * - typeid(uint8_t) -- 8-bit image / video / window
355 * - typeid(uint16_t) -- 16-bit image
356 * - typeid(float) -- HDR image
357 * - typeid(double) -- audio / plot
358 *
359 * Use this to branch once before calling get_value_at<ValueT>() when the
360 * container's native type is not statically known at the call site.
361 */
362 [[nodiscard]] virtual std::type_index value_element_type() const = 0;
363
364 /**
365 * @brief Read a single element at the given N-dimensional coordinates.
366 *
367 * Returns a default-constructed ValueT on coordinate out-of-range or type mismatch.
368 * No conversion is performed: ValueT must match the container's native element type
369 * (query value_element_type() first when the type is not statically known).
370 *
371 * @tparam ValueT Element type. Must satisfy DataVariantElement.
372 * @param coordinates N-dimensional coordinate vector.
373 * @return Native-typed value, zero-initialised on error.
374 */
375 template <DataVariantElement ValueT>
376 [[nodiscard]] ValueT get_value_at(const std::vector<uint64_t>& coordinates) const
377 {
378 ValueT v {};
379 get_value_impl(coordinates, &v, typeid(ValueT));
380 return v;
381 }
382
383 /**
384 * @brief Write a single element at the given N-dimensional coordinates.
385 *
386 * No-ops on coordinate out-of-range or type mismatch.
387 * ValueT must match the container's native element type.
388 *
389 * @tparam ValueT Element type. Must satisfy DataVariantElement.
390 * @param coordinates N-dimensional coordinate vector.
391 * @param value Value to write.
392 */
393 template <DataVariantElement ValueT>
394 void set_value_at(const std::vector<uint64_t>& coordinates, ValueT value)
395 {
396 set_value_impl(coordinates, &value, typeid(ValueT));
397 }
398
399 /**
400 * @brief Add a named group of regions to the container.
401 * @param group RegionGroup to add
402 */
403 virtual void add_region_group(const RegionGroup& group) = 0;
404
405 /**
406 * @brief Get a region group by name.
407 * @param name Name of the region group
408 * @return Reference to the RegionGroup
409 */
410 [[nodiscard]] virtual RegionGroup get_region_group(const std::string& name) const = 0;
411
412 /**
413 * @brief Get all region groups in the container.
414 * @return Map of region group names to RegionGroup objects
415 */
416 [[nodiscard]] virtual std::unordered_map<std::string, RegionGroup> get_all_region_groups() const = 0;
417
418 /**
419 * @brief Remove a region group by name.
420 * @param name Name of the region group to remove
421 */
422 virtual void remove_region_group(const std::string& name) = 0;
423
424 /**
425 * @brief Check if a region is loaded in memory.
426 * @param region Region to check
427 * @return true if region is loaded, false otherwise
428 */
429 [[nodiscard]] virtual bool is_region_loaded(const Region& region) const = 0;
430
431 /**
432 * @brief Load a region into memory.
433 * @param region Region to load
434 */
435 virtual void load_region(const Region& region) = 0;
436
437 /**
438 * @brief Unload a region from memory.
439 * @param region Region to unload
440 */
441 virtual void unload_region(const Region& region) = 0;
442
443 /**
444 * @brief Convert coordinates to linear index based on current memory layout.
445 * @param coordinates N-dimensional coordinates
446 * @return Linear index into the underlying data storage
447 */
448 [[nodiscard]] virtual uint64_t coordinates_to_linear_index(const std::vector<uint64_t>& coordinates) const = 0;
449
450 /**
451 * @brief Convert linear index to coordinates based on current memory layout.
452 * @param linear_index Linear index into the underlying data storage
453 * @return N-dimensional coordinates
454 */
455 [[nodiscard]] virtual std::vector<uint64_t> linear_index_to_coordinates(uint64_t linear_index) const = 0;
456
457 /**
458 * @brief Clear all data in the container.
459 */
460 virtual void clear() = 0;
461
462 /**
463 * @brief Get a raw pointer to the underlying data storage.
464 * @return Pointer to raw data (type depends on DataVariant)
465 */
466 [[nodiscard]] virtual const void* get_raw_data() const = 0;
467
468 /**
469 * @brief Check if the container currently holds any data.
470 * @return true if data is present, false otherwise
471 */
472 [[nodiscard]] virtual bool has_data() const = 0;
473
474 /**
475 * @brief Get the data structure defining this container's layout.
476 * @return Reference to the ContainerDataStructure
477 */
478 [[nodiscard]] virtual ContainerDataStructure& get_structure() = 0;
479 [[nodiscard]] virtual const ContainerDataStructure& get_structure() const = 0;
480
481 /**
482 * @brief Set the data structure for this container.
483 * @param structure New ContainerDataStructure to apply
484 * @note This may trigger reorganization of existing data to match the new structure.
485 */
486 virtual void set_structure(ContainerDataStructure structure) = 0;
487
488protected:
489 /**
490 * @brief Implementation-specific method to retrieve a frame span.
491 * @param frame_index Index of the frame to retrieve
492 * @return DataSpanVariant representing the frame's data
493 */
494 [[nodiscard]] virtual auto get_frame_span_impl(uint64_t frame_index) const -> DataSpanVariant = 0;
495
496 /**
497 * @brief Implementation-specific method to retrieve multiple frames.
498 *
499 * Implementations write up to count * frame_size elements into output,
500 * starting from start_frame. The type parameter indicates the expected
501 * element type; implementations may choose to support or reject it based
502 * on their native data type, but must not write past the output buffer
503 * regardless.
504 *
505 * @param output Pointer to caller-owned buffer for frame data
506 * @param count Number of frames to retrieve (output buffer size in frames)
507 * @param start_frame First frame index to retrieve
508 * @param num_frames Number of frames to retrieve
509 * @param type Type information for the expected element type (e.g. float, uint8_t)
510 */
511 virtual void get_frames_impl(void* output, size_t count, uint64_t start_frame, uint64_t num_frames, const std::type_info& type) const = 0;
512
513 /**
514 * @brief Type-erased single-element read.
515 *
516 * Implementations copy the native element at @p coords into @p out
517 * if @p type matches their native type, otherwise no-op.
518 * @p out points to a caller-owned buffer of exactly sizeof(native type) bytes.
519 */
520 virtual void get_value_impl(const std::vector<uint64_t>& coords,
521 void* out,
522 const std::type_info& type) const = 0;
523
524 /**
525 * @brief Type-erased single-element write.
526 *
527 * Implementations copy from @p in into their storage at @p coords
528 * if @p type matches their native type, otherwise no-op.
529 * @p in points to a caller-owned buffer of exactly sizeof(native type) bytes.
530 */
531 virtual void set_value_impl(const std::vector<uint64_t>& coords,
532 const void* in,
533 const std::type_info& type) = 0;
534};
535
536} // namespace MayaFlux::Kakshya
std::vector< float > * out
glm::vec3 value
std::vector< glm::ivec3 > coords
Definition VDBWriter.cpp:25
vk::PhysicalDeviceType type
Definition VKDevice.cpp:126
std::string name
Definition VKDevice.cpp:123
size_t count
Zero-copy typed view over one frame of container storage.
Definition NDData.hpp:654
void get_frames(std::span< ValueT > output, uint64_t start_frame, uint64_t num_frames) const
Get multiple frames efficiently.
virtual std::vector< T > get_region_data(const Region &region) const =0
Get data for a specific region.
virtual const ContainerDataStructure & get_structure() const =0
virtual void unload_region(const Region &region)=0
Unload a region from memory.
auto get_frame_as(uint64_t frame_index) const -> std::span< const ValueT >
Get a single frame of data as a typed span.
virtual void set_structure(ContainerDataStructure structure)=0
Set the data structure for this container.
auto get_frame(uint64_t frame_index) const -> FrameView
Get a single frame of data efficiently.
virtual std::type_index value_element_type() const =0
Runtime query for the native scalar element type of this container.
virtual void load_region(const Region &region)=0
Load a region into memory.
virtual std::vector< T > get_segments_data(const std::vector< RegionSegment > &segments) const =0
Get data for multiple region segments efficiently.
void get_frames_as(std::vector< ValueT > &output, uint64_t start_frame, uint64_t num_frames) const
Get multiple frames efficiently as a typed span.
virtual auto get_frame_span_impl(uint64_t frame_index) const -> DataSpanVariant=0
Implementation-specific method to retrieve a frame span.
virtual const void * get_raw_data() const =0
Get a raw pointer to the underlying data storage.
virtual void get_frames_impl(void *output, size_t count, uint64_t start_frame, uint64_t num_frames, const std::type_info &type) const =0
Implementation-specific method to retrieve multiple frames.
virtual bool is_region_loaded(const Region &region) const =0
Check if a region is loaded in memory.
virtual std::vector< DataDimension > get_dimensions() const =0
Get the dimensions describing the structure of the data.
ValueT get_value_at(const std::vector< uint64_t > &coordinates) const
Read a single element at the given N-dimensional coordinates.
virtual std::vector< uint64_t > linear_index_to_coordinates(uint64_t linear_index) const =0
Convert linear index to coordinates based on current memory layout.
virtual void set_region_data(const Region &region, const std::vector< T > &data)=0
Set data for a specific region.
virtual void set_value_impl(const std::vector< uint64_t > &coords, const void *in, const std::type_info &type)=0
Type-erased single-element write.
virtual std::vector< T > get_region_group_data(const RegionGroup &regions) const =0
Get data for multiple regions efficiently.
void set_value_at(const std::vector< uint64_t > &coordinates, ValueT value)
Write a single element at the given N-dimensional coordinates.
virtual void add_region_group(const RegionGroup &group)=0
Add a named group of regions to the container.
virtual void set_memory_layout(MemoryLayout layout)=0
Set the memory layout for this container.
virtual uint64_t get_total_elements() const =0
Get the total number of elements in the container.
virtual void get_value_impl(const std::vector< uint64_t > &coords, void *out, const std::type_info &type) const =0
Type-erased single-element read.
virtual uint64_t coordinates_to_linear_index(const std::vector< uint64_t > &coordinates) const =0
Convert coordinates to linear index based on current memory layout.
virtual MemoryLayout get_memory_layout() const =0
Get the memory layout used by this container.
virtual ContainerDataStructure & get_structure()=0
Get the data structure defining this container's layout.
virtual uint64_t get_num_frames() const =0
Get the number of frames in the primary (temporal) dimension.
virtual void remove_region_group(const std::string &name)=0
Remove a region group by name.
virtual bool has_data() const =0
Check if the container currently holds any data.
virtual uint64_t get_frame_size() const =0
Get the number of elements that constitute one "frame".
virtual RegionGroup get_region_group(const std::string &name) const =0
Get a region group by name.
virtual std::unordered_map< std::string, RegionGroup > get_all_region_groups() const =0
Get all region groups in the container.
virtual void clear()=0
Clear all data in the container.
Abstract interface for N-dimensional data containers.
typename detail::span_const_from_vector_variant< DataVariant >::type DataSpanVariant
Definition NDData.hpp:625
DataModality
Data modality types for cross-modal analysis.
Definition NDData.hpp:132
MemoryLayout
Memory layout for multi-dimensional data.
Definition NDData.hpp:33
OrganizationStrategy
Data organization strategy for multi-channel/multi-frame data.
Definition NDData.hpp:43
Container structure for consistent dimension ordering.
Role
Semantic role of the dimension.
Definition NDData.hpp:204
Organizes related signal regions into a categorized collection.
Represents a point or span in N-dimensional space.
Definition Region.hpp:73