23 std::vector<Region> result;
24 std::ranges::copy_if(group.
regions, std::back_inserter(result),
25 [&label](
const Region& region) {
26 return region.get_label() == label;
33 std::vector<Region> result;
34 std::ranges::copy_if(group.
regions, std::back_inserter(result),
35 [&key, &value](
const Region& region) {
36 auto attr_it = region.attributes.find(key);
37 if (attr_it != region.attributes.end()) {
38 if (value.type() == typeid(std::string)) {
39 auto region_value = get_region_attribute<std::string>(region, key);
40 auto search_value = std::any_cast<std::string>(value);
41 return region_value.has_value() && *region_value == search_value;
43 if (value.type() == typeid(double)) {
44 auto region_value = get_region_attribute<double>(region, key);
45 auto search_value = std::any_cast<double>(value);
46 return region_value.has_value() && *region_value == search_value;
48 if (value.type() == typeid(int)) {
49 auto region_value = get_region_attribute<int>(region, key);
50 auto search_value = std::any_cast<int>(value);
51 return region_value.has_value() && *region_value == search_value;
62 std::vector<Region> result;
63 std::ranges::copy_if(group.
regions, std::back_inserter(result),
64 [&coordinates](
const Region& region) {
65 return region.contains(coordinates);
73 for (
size_t i = 0; i < std::min(offset.size(), region.
start_coordinates.size()); ++i) {
83 for (
size_t i = 0; i < std::min(factors.size(), region.
start_coordinates.size()); ++i) {
86 auto new_half_span =
static_cast<uint64_t
>(factors[i] *
static_cast<double>(half_span));
97 auto min_coords = group.
regions.front().start_coordinates;
98 auto max_coords = group.
regions.front().end_coordinates;
100 for (
const auto& region : group.
regions) {
101 for (
size_t i = 0; i < min_coords.size() && i < region.start_coordinates.size(); ++i) {
102 min_coords[i] = std::min(min_coords[i], region.start_coordinates[i]);
104 for (
size_t i = 0; i < max_coords.size() && i < region.end_coordinates.size(); ++i) {
105 max_coords[i] = std::max(max_coords[i], region.end_coordinates[i]);
109 Region bounds(min_coords, max_coords);
116 std::ranges::sort(regions,
126 std::ranges::sort(regions,
128 auto aval = get_region_attribute<std::string>(a, attr_name);
129 auto bval = get_region_attribute<std::string>(b, attr_name);
130 return aval.value_or(
"") < bval.value_or(
"");
136 refs.emplace_back(name, region);
141 auto to_remove = std::ranges::remove_if(refs,
142 [&name](
const auto& pair) {
return pair.first == name; });
143 refs.erase(to_remove.begin(), to_remove.end());
146std::optional<Region>
get_reference_region(
const std::vector<std::pair<std::string, Region>>& refs,
const std::string& name)
148 auto it = std::ranges::find_if(refs,
149 [&name](
const auto& pair) {
return pair.first == name; });
150 if (it != refs.end())
156 const std::vector<std::pair<std::string, Region>>& refs,
const Region& region)
158 std::vector<std::pair<std::string, Region>> result;
160 std::ranges::copy_if(refs, std::back_inserter(result),
161 [®ion](
const auto& pair) {
return region.
contains(pair.second.start_coordinates); });
167 groups[group.
name] = group;
170std::optional<RegionGroup>
get_region_group(
const std::unordered_map<std::string, RegionGroup>& groups,
const std::string& name)
172 auto it = groups.find(name);
173 if (it != groups.end())
184 const std::vector<uint64_t>& output_shape)
186 if (current_pos.size() != output_shape.size()) {
187 throw std::invalid_argument(
"Position and shape vectors must have same size");
190 std::vector<uint64_t> end_pos;
191 end_pos.reserve(current_pos.size());
193 for (
size_t i = 0; i < current_pos.size(); ++i) {
194 if (output_shape[i] == 0) {
195 throw std::invalid_argument(
"Output shape cannot have zero dimensions");
197 end_pos.push_back(current_pos[i] + output_shape[i] - 1);
200 return { current_pos, end_pos };
204 uint64_t frames_to_process,
205 const std::shared_ptr<SignalSourceContainer>& container)
207 const auto& structure = container->get_structure();
208 uint64_t total_frames = structure.get_samples_count_per_channel();
209 uint64_t num_channels = structure.get_channel_count();
211 if (current_frame >= total_frames) {
212 throw std::out_of_range(
"Current frame exceeds container bounds");
215 uint64_t available_frames = total_frames - current_frame;
216 uint64_t actual_frames = std::min(frames_to_process, available_frames);
220 output_shape.
end_coordinates = { current_frame + actual_frames - 1, num_channels - 1 };
226 const std::shared_ptr<SignalSourceContainer>& container)
232 const auto dimensions = container->get_dimensions();
233 const auto memory_layout = container->get_memory_layout();
238 if (memory_layout == MemoryLayout::ROW_MAJOR) {
240 size_t last_dim = dimensions.size() - 1;
243 }
else if (memory_layout == MemoryLayout::COLUMN_MAJOR) {
252std::vector<std::unordered_map<std::string, std::any>>
extract_all_regions_info(
const std::shared_ptr<SignalSourceContainer>& container)
255 throw std::invalid_argument(
"Container is null");
258 auto all_groups = container->get_all_region_groups();
259 std::vector<std::unordered_map<std::string, std::any>> regions_info;
261 for (
const auto& [group_name, group] : all_groups) {
262 for (
size_t i = 0; i < group.regions.size(); ++i) {
263 const auto& region = group.regions[i];
265 std::unordered_map<std::string, std::any> region_info;
266 region_info[
"group_name"] = group_name;
267 region_info[
"region_index"] = i;
268 region_info[
"start_coordinates"] = region.start_coordinates;
269 region_info[
"end_coordinates"] = region.end_coordinates;
270 region_info[
"attributes"] = region.attributes;
272 regions_info.push_back(std::move(region_info));
281 std::unordered_map<std::string, std::any> bounds_info;
287 const auto& first_region = group.
regions[0];
288 std::vector<uint64_t> min_coords = first_region.start_coordinates;
289 std::vector<uint64_t> max_coords = first_region.end_coordinates;
291 for (
size_t i = 1; i < group.
regions.size(); ++i) {
292 const auto& region = group.
regions[i];
294 for (
size_t j = 0; j < min_coords.size() && j < region.start_coordinates.size(); ++j) {
295 min_coords[j] = std::min(min_coords[j], region.start_coordinates[j]);
298 for (
size_t j = 0; j < max_coords.size() && j < region.end_coordinates.size(); ++j) {
299 max_coords[j] = std::max(max_coords[j], region.end_coordinates[j]);
303 bounds_info[
"group_name"] = group.
name;
304 bounds_info[
"num_regions"] = group.
regions.size();
305 bounds_info[
"bounding_min"] = min_coords;
306 bounds_info[
"bounding_max"] = max_coords;
307 bounds_info[
"group_attributes"] = group.
attributes;
314 std::vector<std::unordered_map<std::string, std::any>> metadata_list;
315 metadata_list.reserve(segments.size());
317 for (
const auto& segment : segments) {
318 std::unordered_map<std::string, std::any> segment_info;
319 segment_info[
"start_coordinates"] = segment.source_region.start_coordinates;
320 segment_info[
"end_coordinates"] = segment.source_region.end_coordinates;
321 segment_info[
"region_attributes"] = segment.source_region.attributes;
322 segment_info[
"segment_attributes"] = segment.processing_metadata;
324 metadata_list.push_back(std::move(segment_info));
327 return metadata_list;
332 std::unordered_map<std::string, std::any> bounds_info;
336 std::vector<uint64_t> sizes;
342 bounds_info[
"sizes"] = sizes;
344 uint64_t total_elements = 1;
345 for (uint64_t size : sizes) {
346 total_elements *= size;
348 bounds_info[
"total_elements"] = total_elements;
354 const std::vector<Region>& regions)
356 for (
size_t i = 0; i < regions.size(); ++i) {
357 if (regions[i].contains(position)) {
366 for (
size_t i = 0; i < regions.size(); ++i) {
367 if (regions[i].contains_position(position)) {
378 for (
long i = 0; i < dimensions.size(); ++i) {
379 if (dimensions[i].role == DataDimension::Role::CHANNEL) {
391 std::vector<DataDimension> result;
392 std::ranges::copy_if(dimensions, std::back_inserter(result),
394 return dim.
role != DataDimension::Role::CHANNEL;
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.
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< 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.
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.
Region scale_region(const Region ®ion, const std::vector< double > &factors)
Scale a Region about its center by the given factors.
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< 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::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.
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.
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.
Role role
Semantic hint for common operations.
Minimal dimension descriptor focusing on structure only.
std::unordered_map< std::string, std::any > attributes
Flexible key-value store for group-specific attributes.
std::vector< Region > regions
Collection of regions belonging to this group.
std::string name
Descriptive name of the 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.
std::vector< uint64_t > end_coordinates
Ending frame index (inclusive)
std::vector< uint64_t > start_coordinates
Starting frame index (inclusive)
bool contains(const std::vector< uint64_t > &coordinates) const
Check if the given coordinates are contained within this region.
Represents a point or span in N-dimensional space.