use crate::error::Result;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ConsecutiveConfig {
pub consecutive_bins: usize,
}
impl Default for ConsecutiveConfig {
fn default() -> Self {
Self {
consecutive_bins: 5,
}
}
}
pub fn remove_short_regions(
outlier_bins: &[bool],
config: &ConsecutiveConfig,
) -> Result<Vec<bool>> {
let mut result = outlier_bins.to_vec();
if outlier_bins.is_empty() {
return Ok(result);
}
let mut i = 0;
while i < result.len() {
if !result[i] {
let start = i;
while i < result.len() && !result[i] {
i += 1;
}
let end = i;
let run_length = end - start;
if run_length < config.consecutive_bins && start > 0 && end < result.len() {
for j in start..end {
result[j] = true;
}
}
} else {
i += 1;
}
}
Ok(result)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_remove_short_regions() {
let outlier_bins = vec![
true, true, false, false, false, true, true, true, false, false, true, true, true, true, false, false, false, false, false, true, ];
let config = ConsecutiveConfig {
consecutive_bins: 5,
};
let result = remove_short_regions(&outlier_bins, &config).unwrap();
assert!(result[2]);
assert!(result[3]);
assert!(result[4]);
assert!(result[8]);
assert!(result[9]);
assert!(!result[14]);
assert!(!result[15]);
assert!(!result[16]);
assert!(!result[17]);
assert!(!result[18]);
}
}