use whitenoise_validator::errors::*;
use ndarray::prelude::*;
use crate::NodeArguments;
use whitenoise_validator::base::{Array, ReleaseNode};
use whitenoise_validator::utilities::take_argument;
use crate::components::Evaluable;
use ndarray::{ArrayD, Axis, Array1};
use whitenoise_validator::proto;
use whitenoise_validator::utilities::array::slow_select;
use crate::utilities::to_nd;
impl Evaluable for proto::Filter {
fn evaluate(&self, _privacy_definition: &Option<proto::PrivacyDefinition>, mut arguments: NodeArguments) -> Result<ReleaseNode> {
let mask = take_argument(&mut arguments, "mask")?.array()?.bool()?;
Ok(ReleaseNode::new(match take_argument(&mut arguments, "data")?.array()? {
Array::Str(data) => filter(data, mask)?.into(),
Array::Float(data) => filter(data, mask)?.into(),
Array::Int(data) => filter(data, mask)?.into(),
Array::Bool(data) => filter(data, mask)?.into(),
}))
}
}
pub fn filter<T: Clone + Default>(data: ArrayD<T>, mask: ArrayD<bool>) -> Result<ArrayD<T>> {
let columnar_mask: Array1<bool> = to_nd(mask, 1)?.into_dimensionality::<Ix1>()?;
let mask_indices: Vec<usize> = columnar_mask.iter().enumerate()
.filter(|(_index, &v)| v)
.map(|(index, _)| index)
.collect();
Ok(slow_select(&data, Axis(0), &mask_indices))
}