#[inline]
pub fn dot(a: &[f64], b: &[f64]) -> f64 {
assert_eq!(
a.len(),
b.len(),
"scalar::dot: a.len() ({}) must equal b.len() ({})",
a.len(),
b.len()
);
let n = a.len();
let mut s00 = 0.0_f64; let mut s01 = 0.0_f64; let mut s10 = 0.0_f64; let mut s11 = 0.0_f64; let mut i = 0usize;
while i + 4 <= n {
s00 = f64::mul_add(a[i], b[i], s00);
s01 = f64::mul_add(a[i + 1], b[i + 1], s01);
s10 = f64::mul_add(a[i + 2], b[i + 2], s10);
s11 = f64::mul_add(a[i + 3], b[i + 3], s11);
i += 4;
}
if i + 2 <= n {
s00 = f64::mul_add(a[i], b[i], s00);
s01 = f64::mul_add(a[i + 1], b[i + 1], s01);
i += 2;
}
let mut sum = (s00 + s10) + (s01 + s11);
while i < n {
sum = f64::mul_add(a[i], b[i], sum);
i += 1;
}
sum
}
#[inline]
pub fn sum_of_squares(v: &[f64]) -> f64 {
let n = v.len();
let mut s00 = 0.0_f64; let mut s01 = 0.0_f64; let mut s10 = 0.0_f64; let mut s11 = 0.0_f64; let mut i = 0usize;
while i + 4 <= n {
s00 = f64::mul_add(v[i], v[i], s00);
s01 = f64::mul_add(v[i + 1], v[i + 1], s01);
s10 = f64::mul_add(v[i + 2], v[i + 2], s10);
s11 = f64::mul_add(v[i + 3], v[i + 3], s11);
i += 4;
}
if i + 2 <= n {
s00 = f64::mul_add(v[i], v[i], s00);
s01 = f64::mul_add(v[i + 1], v[i + 1], s01);
i += 2;
}
let mut sum = (s00 + s10) + (s01 + s11);
while i < n {
sum = f64::mul_add(v[i], v[i], sum);
i += 1;
}
sum
}