Skip to main content

ferray_ma/
constructors.rs

1// ferray-ma: Masking constructors (REQ-7, REQ-8, REQ-9)
2//
3// masked_where, masked_invalid, masked_equal, masked_greater, masked_less,
4// masked_not_equal, masked_greater_equal, masked_less_equal,
5// masked_inside, masked_outside
6
7use ferray_core::Array;
8use ferray_core::dimension::Dimension;
9use ferray_core::dtype::Element;
10use ferray_core::error::FerrayResult;
11use num_traits::Float;
12
13use crate::MaskedArray;
14
15/// Create a `MaskedArray` by masking elements where the condition array is `true`.
16///
17/// # Errors
18/// Returns `FerrayError::ShapeMismatch` if `condition` and `data` have different shapes.
19pub fn masked_where<T: Element + Copy, D: Dimension>(
20    condition: &Array<bool, D>,
21    data: &Array<T, D>,
22) -> FerrayResult<MaskedArray<T, D>> {
23    MaskedArray::new(data.clone(), condition.clone())
24}
25
26/// Create a `MaskedArray` by masking NaN and Inf values.
27///
28/// # Errors
29/// Returns an error only for internal failures.
30pub fn masked_invalid<T: Element + Float, D: Dimension>(
31    data: &Array<T, D>,
32) -> FerrayResult<MaskedArray<T, D>> {
33    let mask_data: Vec<bool> = data.iter().map(|v| v.is_nan() || v.is_infinite()).collect();
34    let mask = Array::from_vec(data.dim().clone(), mask_data)?;
35    MaskedArray::new(data.clone(), mask)
36}
37
38/// Create a `MaskedArray` by masking elements equal to `value`.
39///
40/// # Errors
41/// Returns an error only for internal failures.
42pub fn masked_equal<T: Element + PartialEq + Copy, D: Dimension>(
43    data: &Array<T, D>,
44    value: T,
45) -> FerrayResult<MaskedArray<T, D>> {
46    let mask_data: Vec<bool> = data.iter().map(|v| *v == value).collect();
47    let mask = Array::from_vec(data.dim().clone(), mask_data)?;
48    MaskedArray::new(data.clone(), mask)
49}
50
51/// Create a `MaskedArray` by masking elements not equal to `value`.
52///
53/// # Errors
54/// Returns an error only for internal failures.
55pub fn masked_not_equal<T: Element + PartialEq + Copy, D: Dimension>(
56    data: &Array<T, D>,
57    value: T,
58) -> FerrayResult<MaskedArray<T, D>> {
59    let mask_data: Vec<bool> = data.iter().map(|v| *v != value).collect();
60    let mask = Array::from_vec(data.dim().clone(), mask_data)?;
61    MaskedArray::new(data.clone(), mask)
62}
63
64/// Create a `MaskedArray` by masking elements greater than `value`.
65///
66/// # Errors
67/// Returns an error only for internal failures.
68pub fn masked_greater<T: Element + PartialOrd + Copy, D: Dimension>(
69    data: &Array<T, D>,
70    value: T,
71) -> FerrayResult<MaskedArray<T, D>> {
72    let mask_data: Vec<bool> = data.iter().map(|v| *v > value).collect();
73    let mask = Array::from_vec(data.dim().clone(), mask_data)?;
74    MaskedArray::new(data.clone(), mask)
75}
76
77/// Create a `MaskedArray` by masking elements less than `value`.
78///
79/// # Errors
80/// Returns an error only for internal failures.
81pub fn masked_less<T: Element + PartialOrd + Copy, D: Dimension>(
82    data: &Array<T, D>,
83    value: T,
84) -> FerrayResult<MaskedArray<T, D>> {
85    let mask_data: Vec<bool> = data.iter().map(|v| *v < value).collect();
86    let mask = Array::from_vec(data.dim().clone(), mask_data)?;
87    MaskedArray::new(data.clone(), mask)
88}
89
90/// Create a `MaskedArray` by masking elements greater than or equal to `value`.
91///
92/// # Errors
93/// Returns an error only for internal failures.
94pub fn masked_greater_equal<T: Element + PartialOrd + Copy, D: Dimension>(
95    data: &Array<T, D>,
96    value: T,
97) -> FerrayResult<MaskedArray<T, D>> {
98    let mask_data: Vec<bool> = data.iter().map(|v| *v >= value).collect();
99    let mask = Array::from_vec(data.dim().clone(), mask_data)?;
100    MaskedArray::new(data.clone(), mask)
101}
102
103/// Create a `MaskedArray` by masking elements less than or equal to `value`.
104///
105/// # Errors
106/// Returns an error only for internal failures.
107pub fn masked_less_equal<T: Element + PartialOrd + Copy, D: Dimension>(
108    data: &Array<T, D>,
109    value: T,
110) -> FerrayResult<MaskedArray<T, D>> {
111    let mask_data: Vec<bool> = data.iter().map(|v| *v <= value).collect();
112    let mask = Array::from_vec(data.dim().clone(), mask_data)?;
113    MaskedArray::new(data.clone(), mask)
114}
115
116/// Create a `MaskedArray` by masking elements inside the closed interval `[v1, v2]`.
117///
118/// # Errors
119/// Returns an error only for internal failures.
120pub fn masked_inside<T: Element + PartialOrd + Copy, D: Dimension>(
121    data: &Array<T, D>,
122    v1: T,
123    v2: T,
124) -> FerrayResult<MaskedArray<T, D>> {
125    let mask_data: Vec<bool> = data.iter().map(|v| *v >= v1 && *v <= v2).collect();
126    let mask = Array::from_vec(data.dim().clone(), mask_data)?;
127    MaskedArray::new(data.clone(), mask)
128}
129
130/// Create a `MaskedArray` by masking elements outside the closed interval `[v1, v2]`.
131///
132/// # Errors
133/// Returns an error only for internal failures.
134pub fn masked_outside<T: Element + PartialOrd + Copy, D: Dimension>(
135    data: &Array<T, D>,
136    v1: T,
137    v2: T,
138) -> FerrayResult<MaskedArray<T, D>> {
139    let mask_data: Vec<bool> = data.iter().map(|v| *v < v1 || *v > v2).collect();
140    let mask = Array::from_vec(data.dim().clone(), mask_data)?;
141    MaskedArray::new(data.clone(), mask)
142}