1extern crate ndarray;
2extern crate num_traits;
3
4pub fn scalar_product<T>(v: &[T], w: &[T]) -> T
5where T: std::ops::Mul<Output = T> + num_traits::Zero + Copy
6{
7 v.iter()
8 .zip(w.iter())
9 .map(|(x, y)| (*x) * (*y))
10 .fold(T::zero(), |x, y| x + y)
11}
12
13#[cfg(test)]
14mod tests {
15 use crate::scalar_product;
16
17 #[test]
18 fn it_works_with_floats() {
19 let v: Vec<f32> = vec![10.0, 11.0, 0.8];
20 let w: Vec<f32> = vec![11.0, 10.0, 10.0];
21
22 assert!((scalar_product(&v, &w) - 228.0).abs() < std::f32::EPSILON);
23 }
24
25 #[test]
26 fn it_works_with_ints() {
27 let v: Vec<i32> = vec![10, 11, 8];
28 let w: Vec<i32> = vec![11, 10, 1];
29
30 assert_eq!(scalar_product(&v, &w), 228)
31 }
32}