fraug/augmenters/
permutate.rs

1use super::base::Augmenter;
2use rand::rng;
3use rand::seq::SliceRandom;
4use tracing::{info_span};
5/// Permutate time series
6/// 
7/// First, slices each series into segments and then rearranges them randomly
8pub struct Permutate {
9    pub name: String,
10    /// Size of series segments
11    pub window_size: usize,
12    /// Number of segments in window
13    pub segment_size: usize,
14    p: f64,
15}
16
17impl Permutate {
18    /// Creates new permutate augmenter
19    pub fn new(window_size: usize, segment_size: usize) -> Self {
20        Permutate {
21            name: "Permutate".to_string(),
22            window_size,
23            segment_size,
24            p: 1.0,
25        }
26    }
27}
28
29impl Augmenter for Permutate {
30    fn augment_one(&self, x: &[f64]) -> Vec<f64> {
31        let span = info_span!("", step = "augment_one");
32        let _enter = span.enter();
33        let mut windows = x.chunks(self.window_size).collect::<Vec<_>>();
34        let mut res = Vec::with_capacity(windows.len());
35        
36        for window in &mut windows {
37            let mut segments = window.chunks(self.segment_size).collect::<Vec<_>>();
38            
39            segments.shuffle(&mut rng());
40            res.push(segments.iter().map(|arr| arr.to_vec()).flatten().collect::<Vec<f64>>());
41        }
42        
43        res.iter().map(|arr| arr.to_vec()).flatten().collect()
44    }
45
46    fn get_probability(&self) -> f64 {
47        self.p
48    }
49
50    fn set_probability(&mut self, probability: f64) {
51        self.p = probability;
52    }
53
54    fn get_name(&self) ->String {
55        self.name.clone()
56    }
57}