use malevich::stat::Window;
use malevich::{Frame, Line, Plot, Rule};
const UNIFORM_COST: f64 = std::f64::consts::LN_10;
pub fn loss_chart(title: &str, losses: &[f32]) -> String {
let losses: Vec<f64> = losses.iter().copied().map(f64::from).collect();
let window_len = (losses.len() / 20).max(2);
let smoothed = Window::new(window_len).mean(&losses);
Plot::new()
.layer(Line::y(&losses[..]).label("minibatch"))
.layer(Line::y(&smoothed[..]).label("rolling mean"))
.layer(Rule::h(UNIFORM_COST).label("uniform start"))
.title(title)
.x_label("step")
.y_label("loss")
.render_best(&Frame::detect())
}