del_ls/
slice.rs

1//!  operations on slice of an array
2
3/// dot product
4pub 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
24/// {p} = {r} + beta*{p}
25pub 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}