14 template <
typename... Vecs>
16 using type = std::variant<std::span<const typename Vecs::value_type>...>;
94 std::vector<uint16_t>,
95 std::vector<uint32_t>,
96 std::vector<std::complex<float>>,
97 std::vector<std::complex<double>>,
98 std::vector<glm::vec2>,
99 std::vector<glm::vec3>,
100 std::vector<glm::vec4>,
101 std::vector<glm::mat4>
290 DataDimension(std::string n, uint64_t s, uint64_t st = 1,
Role r = Role::CUSTOM);
298 static DataDimension time(uint64_t samples, std::string name =
"time");
324 static DataDimension spatial(uint64_t size,
char axis, uint64_t stride = 1, std::string name =
"spatial");
358 static DataDimension grouped(std::string name, uint64_t element_count, uint8_t components_per_element,
Role role = Role::CUSTOM);
388 using DataModule = std::pair<std::vector<DataVariant>, std::vector<DataDimension>>;
400 template <
typename T>
403 const std::vector<uint64_t>& shape,
404 T default_value = T {},
408 auto dims = create_dimensions(modality, shape, layout);
409 auto variants = create_variants(modality, shape, default_value, strategy);
411 return { std::move(variants), std::move(dims) };
421 static std::vector<DataDimension> create_dimensions(
422 DataModality modality,
423 const std::vector<uint64_t>& shape,
424 MemoryLayout layout = MemoryLayout::ROW_MAJOR);
433 template <
typename T>
436 return create_for_modality(DataModality::AUDIO_1D, { samples }, default_value);
447 template <
typename T>
450 return create_for_modality(DataModality::AUDIO_MULTICHANNEL, { samples, channels }, default_value);
461 template <
typename T>
464 return create_for_modality(DataModality::IMAGE_2D, {
height,
width }, default_value);
475 template <
typename T>
478 return create_for_modality(DataModality::SPECTRAL_2D, { time_windows, frequency_bins }, default_value);
487 static std::vector<uint64_t> calculate_strides(
488 const std::vector<uint64_t>& shape,
489 MemoryLayout layout);
501 template <
typename T>
504 const std::vector<uint64_t>& shape,
508 std::vector<DataVariant> variants;
510 if (org == OrganizationStrategy::INTERLEAVED) {
511 uint64_t total = std::accumulate(shape.begin(), shape.end(), uint64_t(1), std::multiplies<>());
512 variants.emplace_back(std::vector<T>(total, default_value));
517 case DataModality::AUDIO_1D:
518 variants.emplace_back(std::vector<T>(shape[0], default_value));
521 case DataModality::AUDIO_MULTICHANNEL: {
522 uint64_t samples = shape[0];
523 uint64_t channels = shape[1];
524 variants.reserve(channels);
525 for (uint64_t ch = 0; ch < channels; ++ch) {
526 variants.emplace_back(std::vector<T>(samples, default_value));
531 case DataModality::IMAGE_2D:
532 variants.emplace_back(std::vector<T>(shape[0] * shape[1], default_value));
535 case DataModality::IMAGE_COLOR: {
536 uint64_t
height = shape[0];
537 uint64_t
width = shape[1];
538 uint64_t channels = shape[2];
540 variants.reserve(channels);
541 for (uint64_t ch = 0; ch < channels; ++ch) {
542 variants.emplace_back(std::vector<T>(
pixels, default_value));
547 case DataModality::SPECTRAL_2D:
548 variants.emplace_back(std::vector<T>(shape[0] * shape[1], default_value));
551 case DataModality::VOLUMETRIC_3D:
552 variants.emplace_back(std::vector<T>(shape[0] * shape[1] * shape[2], default_value));
555 case DataModality::VIDEO_GRAYSCALE: {
556 uint64_t frames = shape[0];
557 uint64_t
height = shape[1];
558 uint64_t
width = shape[2];
560 variants.reserve(frames);
561 for (uint64_t f = 0; f < frames; ++f) {
562 variants.emplace_back(std::vector<T>(frame_size, default_value));
567 case DataModality::VIDEO_COLOR: {
568 uint64_t frames = shape[0];
569 uint64_t
height = shape[1];
570 uint64_t
width = shape[2];
571 uint64_t channels = shape[3];
573 variants.reserve(frames * channels);
574 for (uint64_t f = 0; f < frames; ++f) {
575 for (uint64_t ch = 0; ch < channels; ++ch) {
576 variants.emplace_back(std::vector<T>(frame_size, default_value));
583 uint64_t total = std::accumulate(shape.begin(), shape.end(), uint64_t(1), std::multiplies<>());
584 variants.emplace_back(std::vector<T>(total, default_value));
638 return std::visit([](
const auto& s) {
return s.empty(); },
m_span);
642 [[nodiscard]]
size_t size()
const
644 return std::visit([](
const auto& s) {
return s.size(); },
m_span);
661 return std::visit([](
const auto& s) {
662 return std::type_index(
typeid(
typename std::decay_t<
decltype(s)>::value_type));
690 template <DataVariantElement T>
691 [[nodiscard]] std::span<const T>
as()
const
693 const auto* s = std::get_if<std::span<const T>>(&
m_span);
694 return s ? *s : std::span<const T> {};
const std::vector< float > * pixels
FrameView()=default
Construct an empty FrameView.
const DataSpanVariant & raw() const
Direct access to the underlying DataSpanVariant for internal use.
std::span< const T > as() const
Return a typed span over the frame data without conversion.
size_t size() const
Number of elements in the frame, in units of the native element type.
std::type_index element_type() const
Runtime query for the native element type of this frame.
FrameView(DataSpanVariant span)
Construct from a DataSpanVariant produced by get_frame_span_impl().
bool empty() const
Returns true if the view holds no elements.
Zero-copy typed view over one frame of container storage.
Concept to constrain types to valid DataVariant elements.
size_t gpu_data_format_bytes(GpuDataFormat fmt) noexcept
Byte size of one element of a GpuDataFormat.
typename detail::span_const_from_vector_variant< DataVariant >::type DataSpanVariant
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.
DataModality
Data modality types for cross-modal analysis.
@ AUDIO_MULTICHANNEL
Multi-channel audio.
@ SPECTRAL_2D
2D spectral data (time + frequency)
@ AUDIO_1D
1D audio signal
@ UNKNOWN
Unknown or undefined modality.
@ IMAGE_COLOR_ARRAY
4D (idx + 2D + color)
@ 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.
@ TEXTURE_2D
2D texture data
@ IMAGE_COLOR
2D RGB/RGBA image
@ IMAGE_2D
2D image (grayscale or single channel)
MemoryLayout
Memory layout for multi-dimensional data.
@ 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.
@ HYBRID
Mixed approach based on access patterns.
@ USER_DEFINED
Custom organization.
@ 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).
GpuDataFormat
GPU data formats with explicit precision levels.
std::string_view modality_to_string(DataModality modality)
Convert DataModality enum to string representation.
ComponentGroup(uint8_t c, uint8_t o=0)
Grouping information for sub-dimensions.
static DataModule create_audio_multichannel(uint64_t samples, uint64_t channels, T default_value=T {})
Create multi-channel audio data module.
Role
Semantic role of the dimension.
static DataModule create_spectral_2d(uint64_t time_windows, uint64_t frequency_bins, T default_value=T {})
Create 2D spectral data module.
std::string name
Human-readable identifier for the dimension.
static DataModule create_audio_1d(uint64_t samples, T default_value=T {})
Create 1D audio data module.
static DataModule create_image_2d(uint64_t height, uint64_t width, T default_value=T {})
Create 2D image data module.
std::pair< std::vector< DataVariant >, std::vector< DataDimension > > DataModule
Data container combining variants and dimensions.
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.
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.
std::optional< ComponentGroup > grouping
Minimal dimension descriptor focusing on structure only.
std::variant< std::span< const typename Vecs::value_type >... > type
Type traits to determine if a type is a valid DataVariant element.