autoregressive 0.1.6

Simple autoregressive model for generate series data
Documentation
use autoregressive::univariate::Autoregressive;
use plotters::{coord::Shift, prelude::*};

const NUM_SAMPLES: usize = 1000;

fn plot<const N: usize>(
    drawing_area: DrawingArea<BitMapBackend, Shift>,
    caption: &str,
    params: &[f32; N],
) -> Result<(), Box<dyn std::error::Error>> {
    let ar = Autoregressive::new(0.0, 1.0, params);
    let data: Vec<(usize, f32)> = ar.enumerate().take(NUM_SAMPLES).collect();
    let (min, max) = data
        .iter()
        .fold((f32::MAX, f32::MIN), |(min, max), (_, v)| {
            (min.min(*v), max.max(*v))
        });
    let avg = data.iter().map(|(_, v)| v).sum::<f32>() / (data.len() as f32);

    let mut chart = ChartBuilder::on(&drawing_area)
        .caption(
            format!("{caption} min: {min:0.1} max: {max:0.1} avg: {avg:0.1}"),
            ("sans-serif", 20),
        )
        .margin_right(20)
        .margin_left(20)
        .margin_bottom(3)
        .build_cartesian_2d(0usize..NUM_SAMPLES, -7.0f32..7.0f32)?;
    chart
        .configure_mesh()
        .disable_x_mesh()
        .max_light_lines(1)
        .draw()?;
    chart.draw_series(LineSeries::new(data.into_iter(), &BLUE))?;

    chart.configure_series_labels().draw()?;
    Ok(())
}

fn main() -> Result<(), Box<dyn std::error::Error>>{
    let root = BitMapBackend::new("chart.png", (640, 480)).into_drawing_area();
    root.fill(&WHITE).unwrap();

    let mut areas = root.split_evenly((5, 1)).into_iter();

    plot(areas.next().unwrap(), "AR0", &[])?;
    plot(areas.next().unwrap(), "AR1 0.3", &[0.3])?;
    plot(areas.next().unwrap(), "AR1 0.9", &[0.9])?;
    plot(areas.next().unwrap(), "AR2 0.3 0.3", &[0.3, 0.3])?;
    plot(areas.next().unwrap(), "AR2 0.9 -0.8", &[0.9, -0.8])?;
    Ok(())
}