pub fn constant_basis(t: &[f64]) -> Vec<f64> {
vec![1.0; t.len()]
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ones_column_shape() {
let t = vec![0.0, 0.5, 1.0];
let basis = constant_basis(&t);
assert_eq!(basis.len(), 3);
for &v in &basis {
assert!((v - 1.0).abs() < 1e-12);
}
}
#[test]
fn empty_input_no_panic() {
let basis = constant_basis(&[]);
assert_eq!(basis.len(), 0);
}
#[test]
fn intercept_only_fit_reproduces_mean() {
let t = vec![0.0, 0.25, 0.5, 0.75, 1.0];
let y = vec![3.0, -1.0, 7.5, 2.0, 0.5];
let x = constant_basis(&t);
assert_eq!(x.len(), y.len());
let xty: f64 = x.iter().zip(&y).map(|(&xi, &yi)| xi * yi).sum();
let xtx: f64 = x.iter().map(|&xi| xi * xi).sum();
let beta = xty / xtx;
let mean_y = y.iter().sum::<f64>() / y.len() as f64;
assert!((beta - mean_y).abs() < 1e-10, "beta={beta}, mean={mean_y}");
}
}