annoy/
lib.rs

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}