64 std::vector<T> result;
65 size_t total_size = 0;
66 for (
const auto&
channel : channel_data) {
69 result.reserve(total_size);
71 for (
const auto&
channel : channel_data) {
87std::vector<T>
extract_region_data(
const std::span<const T>& source_data,
const Region& region,
const std::vector<DataDimension>& dimensions)
91 error<std::out_of_range>(
93 std::source_location::current(),
94 "Requested region is out of bounds for dimension {}",
100 std::vector<T> result;
101 result.reserve(region_size);
106 result.push_back(source_data[linear_index]);
109 for (
int dim = (
int)current.size() - 1; dim >= 0; --dim) {
134 const std::vector<std::span<const T>>& source_data,
136 const std::vector<DataDimension>& dimensions,
137 bool flatten =
false)
139 std::vector<std::vector<T>> results;
141 for (
size_t idx = 0; idx < source_data.size(); ++idx) {
150 results.push_back(std::move(channel_data));
171 const std::vector<std::span<const T>>& source_spans,
173 const std::vector<DataDimension>& dimensions,
176 std::vector<std::vector<T>> result;
177 result.reserve(group.
regions.size());
179 for (
const auto& region : group.
regions) {
180 auto region_data = extract_region_data<T>(source_spans, region, dimensions, organization);
186 for (
size_t i = 0; i < region_data[0].size(); i++) {
187 result[0].push_back(region_data[0][i]);
191 result.resize(region_data.size());
193 auto channel_pairs = std::views::zip(result, region_data);
194 auto total_sizes = channel_pairs | std::views::transform([](
auto&& pair) {
195 return std::get<0>(pair).size() + std::get<1>(pair).size();
199 for (
auto size : total_sizes) {
200 result[i].reserve(
size);
201 std::ranges::copy(region_data[i],
202 std::back_inserter(result[i]));
222 const std::vector<RegionSegment>& segments,
223 const std::vector<std::span<const T>>& source_spans,
224 const std::vector<DataDimension>& dimensions,
227 if (source_spans.size() != 1) {
228 error<std::invalid_argument>(
230 std::source_location::current(),
231 "Source spans cannot be empty");
234 std::vector<std::vector<T>> result;
236 for (
const auto& segment : segments) {
237 if (segment.is_cached && !segment.cache.data.empty()) {
238 for (
const auto& variant : segment.cache.data) {
239 std::vector<T> converted;
240 auto span = extract_from_variant<T>(variant, converted);
241 std::vector<T> cached_data(span.begin(), span.end());
246 std::ranges::copy(cached_data, std::back_inserter(result[0]));
248 if (result.size() <= result.size())
249 result.resize(result.size() + 1);
250 result.back() = std::move(cached_data);
254 auto region_data = extract_region_data<T>(source_spans, segment.source_region, dimensions, organization);
259 std::ranges::copy(region_data[0], std::back_inserter(result[0]));
262 result.resize(region_data.size());
263 for (
size_t i = 0; i < region_data.size(); ++i) {
264 std::ranges::copy(region_data[i], std::back_inserter(result[i]));
283 const std::vector<T>& data,
285 const std::vector<DataDimension>& dimensions)
287 std::span<const T> data_span(data.data(), data.size());
301 const std::vector<std::vector<T>>& source_data,
303 const std::vector<DataDimension>& dimensions)
305 std::vector<std::span<const T>> source_spans;
306 source_spans.reserve(source_data.size());
308 for (
const auto&
channel : source_data) {
326 const std::vector<std::span<const T>>& source_spans,
328 const std::vector<DataDimension>& dimensions,
332 return std::vector<std::vector<T>> {
350 std::span<T> dest_data,
351 std::span<const T> source_data,
353 const std::vector<DataDimension>& dimensions)
356 size_t source_index = 0;
357 while (source_index < source_data.size()) {
359 dest_data[linear_index] = source_data[source_index++];
369 for (
int dim =
static_cast<int>(current.size()) - 1; dim >= 0; --dim) {
393 std::vector<std::span<T>>& dest_spans,
394 const std::vector<std::span<const T>>& source_data,
396 const std::vector<DataDimension>& dimensions)
398 size_t channel_dim_idx = 0;
399 for (
size_t i = 0; i < dimensions.size(); ++i) {
409 for (
size_t ch = start_channel; ch <= end_channel && ch < dest_spans.size(); ++ch) {
410 size_t source_channel_idx = ch - start_channel;
411 if (source_channel_idx >= source_data.size())
419 source_data[source_channel_idx],
436 std::vector<std::span<T>>& dest_spans,
437 const std::vector<std::span<const T>>& source_data,
439 const std::vector<DataDimension>& dimensions,
469 return safe_any_cast<T>(it->second);
470 }
catch (
const std::bad_any_cast&) {
516Region
translate_region(
const Region& region,
const std::vector<int64_t>& offset);
524Region
scale_region(
const Region& region,
const std::vector<double>& factors);
553void add_reference_region(std::vector<std::pair<std::string, Region>>& refs,
const std::string& name,
const Region& region);
568std::optional<Region>
get_reference_region(
const std::vector<std::pair<std::string, Region>>& refs,
const std::string& name);
576std::vector<std::pair<std::string, Region>>
find_references_in_region(
const std::vector<std::pair<std::string, Region>>& refs,
const Region& region);
583void add_region_group(std::unordered_map<std::string, RegionGroup>& groups,
const RegionGroup& group);
591std::optional<RegionGroup>
get_region_group(
const std::unordered_map<std::string, RegionGroup>& groups,
const std::string& name);
598void remove_region_group(std::unordered_map<std::string, RegionGroup>& groups,
const std::string& name);
607 const std::vector<uint64_t>& output_shape);
617 uint64_t frames_to_process,
618 const std::shared_ptr<SignalSourceContainer>& container);
627 const std::shared_ptr<SignalSourceContainer>& container);
634std::vector<std::unordered_map<std::string, std::any>>
extract_all_regions_info(
const std::shared_ptr<SignalSourceContainer>& container);
648std::vector<std::unordered_map<std::string, std::any>>
extract_segments_metadata(
const std::vector<RegionSegment>& segments);
664 const std::vector<Region>& regions);
685[[nodiscard]]
bool regions_intersect(
const Region& r1,
const Region& r2)
noexcept;
717 std::span<const T> src,
719 const std::vector<DataDimension>& dims)
722 error<std::invalid_argument>(
724 std::source_location::current(),
725 "extract_nd_region: dims must not be empty");
729 for (
const auto& d : dims)
732 if (src.size() < total) {
733 error<std::invalid_argument>(
735 std::source_location::current(),
736 "extract_nd_region: src smaller than total element count implied by dims");
742 for (
size_t i = 0; i < dims.size(); ++i) {
750 return extract_region_data<T>(src, clamped, dims);
770 const std::vector<Region>& regions,
771 const std::shared_ptr<SignalSourceContainer>& source,
772 uint32_t num_channels,
@ Runtime
General runtime operations (default fallback)
@ Kakshya
Containers[Signalsource, Stream, File], Regions, DataProcessors.
uint64_t coordinates_to_linear(const std::vector< uint64_t > &coords, const std::vector< DataDimension > &dimensions)
Convert N-dimensional coordinates to a linear index for interleaved data.
std::vector< T > extract_region(const std::vector< T > &data, const Region ®ion, const std::vector< DataDimension > &dimensions)
Extract a region of data from a vector using a Region and dimension info.
void set_region_attribute(Region ®ion, const std::string &key, std::any value)
Set an attribute value on a Region.
Region remove_channel_dimension(const Region ®ion, const std::vector< DataDimension > &dimensions)
Remove the channel dimension from a Region.
std::vector< std::vector< T > > extract_segments_data(const std::vector< RegionSegment > &segments, const std::vector< std::span< const T > > &source_spans, const std::vector< DataDimension > &dimensions, OrganizationStrategy organization)
Extract data for multiple segments from multi-channel source data.
void sort_regions_by_attribute(std::vector< Region > ®ions, const std::string &attr_name)
Sort a vector of Regions by a specific attribute (numeric).
std::optional< T > get_region_attribute(const Region ®ion, const std::string &key)
Get an attribute value from a Region by key.
std::optional< RegionGroup > get_region_group(const std::unordered_map< std::string, RegionGroup > &groups, const std::string &name)
Get a RegionGroup by name from a group map.
std::vector< Region > find_regions_with_label(const RegionGroup &group, const std::string &label)
Find all regions in a RegionGroup with a given label.
bool is_region_access_contiguous(const Region ®ion, const std::shared_ptr< SignalSourceContainer > &container)
Check if region access will be contiguous in memory.
std::unordered_map< std::string, std::any > extract_region_bounds_info(const Region ®ion)
Extract structured bounds information from region.
std::vector< T > flatten_channels(const std::vector< std::vector< T > > &channel_data)
Flatten a vector of channel data into a single vector.
std::function< void(std::span< double >)> RegionTaper
Per-region taper applied in-place before the write callback is invoked.
void add_reference_region(std::vector< std::pair< std::string, Region > > &refs, const std::string &name, const Region ®ion)
Add a named reference region to a reference list.
Region translate_region(const Region ®ion, const std::vector< int64_t > &offset)
Translate a Region by an offset vector.
void add_region_group(std::unordered_map< std::string, RegionGroup > &groups, const RegionGroup &group)
Add a RegionGroup to a group map.
std::function< void(size_t region_idx, uint32_t channel, std::span< double >)> RegionWriteFn
Callback invoked once per region per channel during iteration.
Region scale_region(const Region ®ion, const std::vector< double > &factors)
Scale a Region about its center by the given factors.
void iterate_region_channels(const std::vector< Region > ®ions, const std::shared_ptr< SignalSourceContainer > &source, uint32_t num_channels, const RegionTaper &taper, const RegionWriteFn &write_fn)
Iterate over a set of regions, extracting per-channel samples and dispatching them to a write callbac...
bool regions_intersect(const Region &r1, const Region &r2) noexcept
Test whether two N-dimensional regions overlap on every shared axis.
std::vector< std::vector< T > > extract_group_data(const std::vector< std::span< const T > > &source_spans, const RegionGroup &group, const std::vector< DataDimension > &dimensions, OrganizationStrategy organization)
Extract data for multiple regions from multi-channel source data.
OrganizationStrategy
Data organization strategy for multi-channel/multi-frame data.
@ INTERLEAVED
Single DataVariant with interleaved data (LRLRLR for stereo)
std::vector< std::unordered_map< std::string, std::any > > extract_segments_metadata(const std::vector< RegionSegment > &segments)
Extract metadata from region segments.
void remove_region_group(std::unordered_map< std::string, RegionGroup > &groups, const std::string &name)
Remove a RegionGroup by name from a group map.
std::unordered_map< std::string, std::any > extract_group_bounds_info(const RegionGroup &group)
Extract bounds information from region group.
std::vector< Region > find_regions_containing_coordinates(const RegionGroup &group, const std::vector< uint64_t > &coordinates)
Find all regions in a RegionGroup that contain the given coordinates.
void remove_reference_region(std::vector< std::pair< std::string, Region > > &refs, const std::string &name)
Remove a named reference region from a reference list.
std::vector< T > extract_region_data(const std::span< const T > &source_data, const Region ®ion, const std::vector< DataDimension > &dimensions)
Extract a region of data from a flat data span using a Region and dimension info.
std::vector< Region > find_regions_with_attribute(const RegionGroup &group, const std::string &key, const std::any &value)
Find all regions in a RegionGroup with a specific attribute value.
std::vector< std::unordered_map< std::string, std::any > > extract_all_regions_info(const std::shared_ptr< SignalSourceContainer > &container)
Extract all regions from container's region groups.
Region get_bounding_region(const RegionGroup &group)
Get the bounding region that contains all regions in a RegionGroup.
std::vector< std::pair< std::string, Region > > find_references_in_region(const std::vector< std::pair< std::string, Region > > &refs, const Region ®ion)
Find all references in a reference list that overlap a given region.
std::vector< T > extract_nd_region(std::span< const T > src, const Region ®ion, const std::vector< DataDimension > &dims)
Extract the data described by region from src using the container's dimension descriptors.
std::optional< size_t > find_region_for_position(const std::vector< uint64_t > &position, const std::vector< Region > ®ions)
Find optimal region containing given position.
Region calculate_output_region(const std::vector< uint64_t > ¤t_pos, const std::vector< uint64_t > &output_shape)
Calculate output region bounds from current position and shape.
uint64_t calculate_region_size(const Region ®ion)
Calculate the total number of elements in a region.
std::optional< Region > get_reference_region(const std::vector< std::pair< std::string, Region > > &refs, const std::string &name)
Get a named reference region from a reference list.
void set_or_update_region_data(std::span< T > dest_data, std::span< const T > source_data, const Region ®ion, const std::vector< DataDimension > &dimensions)
Write or update a region of data in a flat data span (interleaved).
std::vector< DataDimension > get_non_channel_dimensions(const std::vector< DataDimension > &dimensions)
Get all non-channel dimensions from a list of dimensions.
void sort_regions_by_dimension(std::vector< Region > ®ions, size_t dimension)
Sort a vector of Regions by a specific dimension.
@ CHANNEL
Parallel streams (audio channels, color channels)
std::vector< Region > regions
Collection of regions belonging to this group.
Organizes related signal regions into a categorized collection.
std::unordered_map< std::string, std::any > attributes
Flexible key-value store for region-specific attributes.
uint64_t get_volume() const
Get the total volume (number of elements) in the region.
std::vector< uint64_t > end_coordinates
Ending frame index (inclusive)
std::vector< uint64_t > start_coordinates
Starting frame index (inclusive)
Represents a point or span in N-dimensional space.