1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
extern crate ndarray;
extern crate num_traits;

pub fn scalar_product<T>(v: &[T], w: &[T]) -> T
where T: std::ops::Mul<Output = T> + num_traits::Zero + Copy
{
    v.iter()
        .zip(w.iter())
        .map(|(x, y)| (*x) * (*y))
        .fold(T::zero(), |x, y| x + y)
}

#[cfg(test)]
mod tests {
    use crate::scalar_product;

    #[test]
    fn it_works_with_floats() {
        let v: Vec<f32> = vec![10.0, 11.0, 0.8];
        let w: Vec<f32> = vec![11.0, 10.0, 10.0];

        assert!((scalar_product(&v, &w) - 228.0).abs() < std::f32::EPSILON);
    }

    #[test]
    fn it_works_with_ints() {
        let v: Vec<i32> = vec![10, 11, 8];
        let w: Vec<i32> = vec![11, 10, 1];

        assert_eq!(scalar_product(&v, &w), 228)
    }
}