use std::ops::{Div, DivAssign};
use num_traits::Zero;
use arrayvec::Array;
use super::SparseVector;
impl<T, A> Div<T> for SparseVector<A>
where
T: Copy + Zero + Div<T, Output = T>,
A: Array<Item = (usize, T)>,
{
type Output = SparseVector<A>;
#[inline]
fn div(mut self, rhs: T) -> Self::Output {
self.div_assign(rhs);
self
}
}
impl<T, A> DivAssign<T> for SparseVector<A>
where
T: Copy + Zero + Div<T, Output = T>,
A: Array<Item = (usize, T)>,
{
fn div_assign(&mut self, rhs: T) {
self.components = {
self.iter().filter_map(|(index, lhs)| {
let value = lhs / rhs;
if value.is_zero() {
None
} else {
Some((index, value))
}
})
.collect()
};
}
}
#[cfg(test)]
mod test {
use super::*;
use expectest::prelude::*;
#[test]
fn div() {
let subject = SparseVector::from([(0, 0.4), (1, 1.0), (2, 2.0), (4, 4.0), (5, 8.0)]);
let expected = SparseVector::from([(0, 0.2), (1, 0.5), (2, 1.0), (4, 2.0), (5, 4.0)]);
let result = subject / 2.0;
expect!(result).to(be_equal_to(expected));
}
#[test]
fn div_assign() {
let subject = SparseVector::from([(0, 0.4), (1, 1.0), (2, 2.0), (4, 4.0), (5, 8.0)]);
let expected = SparseVector::from([(0, 0.2), (1, 0.5), (2, 1.0), (4, 2.0), (5, 4.0)]);
let mut result = subject;
result /= 2.0;
expect!(result).to(be_equal_to(expected));
}
}