use hessboost::objective::LambdaRank;
use hessboost::prelude::*;
mod common;
use common::lcg;
fn main() -> Result<()> {
let (n_groups, per) = (200usize, 6usize);
let n = n_groups * per;
let mut rng = lcg(11);
let mut x = Vec::with_capacity(n);
let mut y = Vec::with_capacity(n);
for _ in 0..n_groups {
for d in 0..per {
let rel = d as f32; x.push(rel + (rng() - 0.5) * 0.9);
y.push(rel);
}
}
let sizes = vec![per; n_groups];
let dtrain = DMatrix::from_dense(&x, n, 1)?
.with_labels(&y)?
.with_group_sizes(&sizes)?;
let params = TrainingParams::builder()
.objective(Objective::RankNdcg(LambdaRank::default()))
.max_depth(3)
.eta(0.2)
.build()?;
let out = Trainer::new(¶ms, &dtrain, 40)
.eval(&dtrain, "train")
.train()?;
let ndcg = |r: hessboost::training::RoundEval| r.score("train", "ndcg@32").unwrap();
println!(
"NDCG: round 0 = {:.3} → final = {:.3}",
ndcg(out.history.round(0).unwrap()),
ndcg(out.history.last().unwrap())
);
Ok(())
}