use kernel_density::{density::Density, kde};
use crate::*;
pub fn optimize<T: BlackboxInput>(n_iter: usize) -> Vec<(T, f64)> {
let domains = T::get_domains();
let mut history = Vec::new();
{
let x = T::random();
let y = x.evaluate();
history.push((x, y));
}
for _ in 0..n_iter {
history.sort_by(|a, b| a.1.partial_cmp(&b.1).unwrap());
let params = select_candidate(&history, &domains);
}
history
}
fn select_candidate<T: BlackboxInput>(history: &Vec<(T, f64)>, domains: &Vec<Variable>) -> T {
const BANDWIDTH: f64 = 0.5;
const MU: f64 = 0.2;
let y_target = history[(MU * history.len() as f64) as usize].1;
let g: Vec<Box<dyn Density>> = domains.iter().enumerate().map(|(i, domain)| {
kde::normal(history.iter()
.filter(|h| h.1 > MU)
.map(|h| h.0.get(i).as_num())
.collect(),
BANDWIDTH)
}).collect();
let l: Vec<Box<dyn Density>> = domains.iter().enumerate().map(|(i, domain)| {
kde::normal(history.iter()
.filter(|h| h.1 < MU)
.map(|h| h.0.get(i).as_num())
.collect(),
BANDWIDTH)
}).collect();
for (domain, g, l) in izip!(domains, &g, &l) {
}
unimplemented!()
}