use anyhow::Result;
use approx::assert_abs_diff_eq;
use ndarray::{array, Array1, Array2};
use ndarray_glm::{standardize, Linear, Logistic, ModelBuilder};
#[test]
fn same_lin_intercept() -> Result<()> {
let y_data: Array1<f64> = array![0.3, 0.5, 0.8, 0.2];
let x_data: Array2<f64> = array![[1.5, 0.6], [2.1, 0.8], [1.2, 0.7], [1.6, 0.3]];
let x_data = standardize(x_data);
let lin_model = ModelBuilder::<Linear>::data(&y_data, &x_data).build()?;
let lin_fit = lin_model.fit()?;
let lin_model_reg = ModelBuilder::<Linear>::data(&y_data, &x_data).build()?;
let lin_fit_reg = lin_model_reg.fit_options().l2_reg(1.0).fit()?;
dbg!(&lin_fit.result);
dbg!(&lin_fit_reg.result);
assert_abs_diff_eq!(
lin_fit.result[0],
lin_fit_reg.result[0],
epsilon = 2.0 * f64::EPSILON
);
Ok(())
}
#[test]
fn lasso_smooth_underconstrained() -> Result<()> {
let y_data: Array1<bool> = array![true, false, true];
let x_data: Array2<f64> = array![[0.1, 1.5, 8.0], [-0.1, 1.0, -12.0], [0.2, 0.5, 9.5]];
let model = ModelBuilder::<Logistic>::data(&y_data, &x_data).build()?;
let fit = model.fit_options().l1_smooth_reg(1.0, 1e-2).fit()?;
dbg!(fit.result);
let like = fit.model_like;
assert!(like.is_normal());
Ok(())
}