1pub fn dot<T>(v0: &[T], v1: &[T]) -> T
5where
6 T: Copy + std::ops::Mul<Output = T> + num_traits::Zero,
7{
8 assert_eq!(v0.len(), v1.len());
9 v0.iter()
10 .zip(v1.iter())
11 .fold(T::zero(), |sum, (&x, &y)| sum + x * y)
12}
13
14pub fn add_scaled_vector<T>(u: &mut [T], alpha: T, p: &[T])
15where
16 T: std::ops::Mul<Output = T> + std::ops::AddAssign + Copy,
17{
18 assert_eq!(u.len(), p.len());
19 u.iter_mut()
20 .zip(p.iter())
21 .for_each(|(a, &b)| *a += alpha * b);
22}
23
24pub fn scale_and_add_vec<T>(p: &mut [T], beta: T, r: &[T])
26where
27 T: std::ops::Mul<Output = T> + std::ops::Add<Output = T> + Copy,
28{
29 assert_eq!(r.len(), p.len());
30 for i in 0..p.len() {
31 p[i] = r[i] + beta * p[i];
32 }
33}
34
35pub fn set_zero<T>(p: &mut [T])
36where
37 T: Copy + num_traits::Zero,
38{
39 p.iter_mut().for_each(|v| *v = T::zero());
40}
41
42pub fn copy<T>(p: &mut [T], u: &[T])
43where
44 T: Copy,
45{
46 assert_eq!(p.len(), u.len());
47 p.iter_mut().zip(u.iter()).for_each(|(a, &b)| *a = b);
48}
49
50pub fn sub(p: &mut [f32], u: &[f32], v: &[f32]) {
51 assert_eq!(p.len(), u.len());
52 for i in 0..p.len() {
53 p[i] = u[i] - v[i];
54 }
55}