MayaFlux 0.3.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
Extract.cpp
Go to the documentation of this file.
1#include "Extract.hpp"
2
4
5bool validate_window_parameters(uint32_t window_size, uint32_t hop_size, size_t data_size) noexcept
6{
7 if (window_size == 0 || hop_size == 0)
8 return false;
9 if (data_size == 0)
10 return true;
11 return data_size >= 3;
12}
13
14std::vector<std::pair<size_t, size_t>> merge_intervals(
15 const std::vector<std::pair<size_t, size_t>>& intervals)
16{
17 if (intervals.empty())
18 return {};
19
20 auto sorted = intervals;
21 std::ranges::sort(sorted, [](const auto& a, const auto& b) { return a.first < b.first; });
22
23 std::vector<std::pair<size_t, size_t>> merged;
24 merged.push_back(sorted[0]);
25
26 for (size_t i = 1; i < sorted.size(); ++i) {
27 auto& last = merged.back();
28 const auto& cur = sorted[i];
29 if (cur.first <= last.second) {
30 last.second = std::max(last.second, cur.second);
31 } else {
32 merged.push_back(cur);
33 }
34 }
35
36 return merged;
37}
38
39std::vector<double> slice_intervals(
40 std::span<const double> data,
41 const std::vector<std::pair<size_t, size_t>>& intervals)
42{
43 std::vector<double> out;
44 for (const auto& [s, e] : intervals) {
45 if (s < data.size() && e <= data.size() && s < e) {
46 out.insert(out.end(), data.begin() + s, data.begin() + e);
47 }
48 }
49 return out;
50}
51
52std::vector<std::pair<size_t, size_t>> regions_around_positions(
53 const std::vector<size_t>& positions,
54 size_t half_region,
55 size_t data_size)
56{
57 std::vector<std::pair<size_t, size_t>> out;
58 out.reserve(positions.size());
59 for (size_t pos : positions) {
60 const size_t s = (pos >= half_region) ? pos - half_region : 0;
61 const size_t e = std::min(pos + half_region, data_size);
62 if (s < e)
63 out.emplace_back(s, e);
64 }
65 return out;
66}
67
68std::vector<std::pair<size_t, size_t>> intervals_from_window_starts(
69 const std::vector<size_t>& window_starts,
70 uint32_t window_size,
71 size_t data_size)
72{
73 std::vector<std::pair<size_t, size_t>> out;
74 out.reserve(window_starts.size());
75 for (size_t s : window_starts) {
76 const size_t e = std::min(s + static_cast<size_t>(window_size), data_size);
77 if (s < e)
78 out.emplace_back(s, e);
79 }
80 return out;
81}
82
83std::vector<double> overlapping_windows(
84 std::span<const double> data,
85 uint32_t window_size,
86 double overlap)
87{
88 if (window_size == 0 || overlap < 0.0 || overlap >= 1.0 || data.size() < window_size)
89 return {};
90
91 const auto hop = std::max(1U, static_cast<uint32_t>(window_size * (1.0 - overlap)));
92 std::vector<double> out;
93 out.reserve(((data.size() - window_size) / hop + 1) * window_size);
94
95 for (size_t start = 0; start + window_size <= data.size(); start += hop)
96 out.insert(out.end(), data.begin() + start, data.begin() + start + window_size);
97
98 return out;
99}
100
101std::vector<double> windowed_by_indices(
102 std::span<const double> data,
103 const std::vector<size_t>& window_starts,
104 uint32_t window_size)
105{
106 std::vector<double> out;
107 if (window_size == 0)
108 return out;
109
110 out.reserve(window_starts.size() * window_size);
111 for (size_t s : window_starts) {
112 if (s + window_size <= data.size()) {
113 out.insert(out.end(), data.begin() + s, data.begin() + s + window_size);
114 }
115 }
116
117 return out;
118}
119
120} // namespace MayaFlux::Kinesis::Discrete
Discrete sequence extraction primitives for MayaFlux::Kinesis.
Eigen::Index overlap
size_t a
size_t b
std::vector< double > overlapping_windows(std::span< const double > data, uint32_t window_size, double overlap)
Extract overlapping windows as a flat concatenated vector.
Definition Extract.cpp:83
std::vector< double > windowed_by_indices(std::span< const double > data, const std::vector< size_t > &window_starts, uint32_t window_size)
Extract windows at specific starting indices as a flat concatenated vector.
Definition Extract.cpp:101
bool validate_window_parameters(uint32_t window_size, uint32_t hop_size, size_t data_size) noexcept
Validate window/hop parameters for windowed processing.
Definition Extract.cpp:5
std::vector< std::pair< size_t, size_t > > merge_intervals(const std::vector< std::pair< size_t, size_t > > &intervals)
Merge overlapping or adjacent half-open intervals.
Definition Extract.cpp:14
std::vector< std::pair< size_t, size_t > > intervals_from_window_starts(const std::vector< size_t > &window_starts, uint32_t window_size, size_t data_size)
Build [start, end) intervals from window start indices.
Definition Extract.cpp:68
std::vector< double > slice_intervals(std::span< const double > data, const std::vector< std::pair< size_t, size_t > > &intervals)
Copy data from a set of half-open intervals into a flat vector.
Definition Extract.cpp:39
std::vector< std::pair< size_t, size_t > > regions_around_positions(const std::vector< size_t > &positions, size_t half_region, size_t data_size)
Build [start, end) intervals centred on a set of positions.
Definition Extract.cpp:52