use num_traits::Float;
pub fn segsum<T: Float>(x: &[T]) -> Vec<T> {
let n = x.len();
let mut out = vec![T::neg_infinity(); n * n];
for i in 0..n {
out[i * n + i] = T::zero(); let mut running = T::zero();
for j in (0..i).rev() {
running = running + x[j + 1];
out[i * n + j] = running;
}
}
out
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn empty_returns_empty() {
assert!(segsum::<f64>(&[]).is_empty());
}
#[test]
fn small_case() {
let x = [1.0, 2.0, 3.0];
let m = segsum(&x);
assert_eq!(m[2 * 3 + 0], 5.0);
assert_eq!(m[0], 0.0);
assert_eq!(m[1 * 3 + 1], 0.0);
}
}