use hyperopt_core::{Direction, Pruner, StudyState, Trial};
mod median;
mod successive_halving;
pub use median::MedianPruner;
pub use successive_halving::SuccessiveHalvingPruner;
#[derive(Debug, Clone, Copy, Default)]
pub struct NopPruner;
impl NopPruner {
pub fn new() -> Self {
NopPruner
}
}
impl Pruner for NopPruner {
fn should_prune(&self, _study_state: &StudyState, _trial: &Trial) -> bool {
false
}
}
pub(crate) fn is_worse(direction: Direction, value: f64, reference: f64) -> bool {
match direction {
Direction::Minimize => value > reference,
Direction::Maximize => value < reference,
}
}
pub(crate) fn median(values: &[f64]) -> Option<f64> {
if values.is_empty() {
return None;
}
let mut v: Vec<f64> = values.iter().copied().filter(|x| x.is_finite()).collect();
if v.is_empty() {
return None;
}
v.sort_by(|a, b| a.total_cmp(b));
let n = v.len();
if n % 2 == 1 {
Some(v[n / 2])
} else {
Some((v[n / 2 - 1] + v[n / 2]) / 2.0)
}
}