use std::convert::TryInto;
use std::io;
use std::io::prelude::*;
use lace::examples::animals::Column;
use lace::examples::Example;
use lace::prelude::*;
const N: usize = 8;
fn main() {
let oracle = Example::Animals.oracle().unwrap();
println!("I(<info_prop>) <target> => [<predictor_1>, ..., <predictor_N>]");
let mut output: Vec<_> = (0..85)
.map(|col_ix| {
let predictors: Vec<(Column, f64)> = oracle
.predictor_search(&[col_ix], N, 10_000)
.unwrap()
.drain(..)
.map(|(ix, info_prop)| (ix.try_into().unwrap(), info_prop))
.collect();
let col: Column = col_ix.try_into().unwrap();
let pred_cols: Vec<_> =
predictors.iter().map(|(col, _)| col).collect();
let ip = predictors[N - 1].1;
let out = format!("I({:.4}) {:?} => {:?}", ip, col, pred_cols);
print!(".");
io::stdout().flush().expect("Could not flush stdout");
(ip, out)
})
.collect();
println!();
output.sort_by(|a, b| a.1.partial_cmp(&b.1).unwrap());
output.reverse();
output.iter().for_each(|(_, out)| println!("{}", out));
}