use malevich::stat::Window;
use malevich::{Frame, Line, Plot, Rule};
const BIGRAM_LIMIT: f64 = 2.45;
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(BIGRAM_LIMIT).label("bigram limit"))
.title(title)
.x_label("step")
.y_label("loss")
.render_best(&Frame::detect())
}