somatize_study/partition/
time_series.rs1use super::{Fold, Partition, PartitionError};
4use crate::Samples;
5use std::fmt;
6
7#[derive(Debug, Clone, PartialEq, Eq, Hash)]
16pub struct TimeSeries {
17 pub k: usize,
19 pub gap: usize,
21}
22
23impl TimeSeries {
24 pub fn folds(&self, samples: &Samples) -> Result<Vec<Fold>, PartitionError> {
26 let n = samples.n();
27 if self.k == 0 {
28 return Err(PartitionError::TooFewFolds { k: self.k });
29 }
30 let size = n / (self.k + 1);
32 if size == 0 {
33 return Err(PartitionError::MoreFoldsThanSamples { k: self.k, n });
34 }
35 (0..self.k)
36 .map(|i| {
37 let start = n - (self.k - i) * size;
38 if start <= self.gap {
39 return Err(PartitionError::GapTooLarge {
40 gap: self.gap,
41 k: self.k,
42 });
43 }
44 Ok(Fold {
45 train: (0..start - self.gap).collect(),
46 test: (start..start + size).collect(),
47 })
48 })
49 .collect()
50 }
51}
52
53impl fmt::Display for TimeSeries {
54 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
55 match self.gap {
56 0 => write!(f, "timeseries:{}", self.k),
57 gap => write!(f, "timeseries:{}:gap:{gap}", self.k),
58 }
59 }
60}
61
62impl From<TimeSeries> for Partition {
63 fn from(cut: TimeSeries) -> Self {
64 Self::TimeSeries(cut)
65 }
66}