use crate::domain::Domain;
pub trait DomainCostEval<D: Domain> {
fn cost(&self, domain: &D, val: &D::Value) -> f64;
fn min_cost(&self, domain: &D) -> f64;
fn max_cost(&self, domain: &D) -> f64;
}
pub(crate) struct ZeroCost;
impl<D: Domain> DomainCostEval<D> for ZeroCost {
#[inline]
fn cost(&self, _domain: &D, _val: &D::Value) -> f64 {
0.0
}
#[inline]
fn min_cost(&self, _domain: &D) -> f64 {
0.0
}
#[inline]
fn max_cost(&self, _domain: &D) -> f64 {
0.0
}
}
pub(crate) struct CostDomainEval;
impl<D: crate::domain::CostDomain> DomainCostEval<D> for CostDomainEval {
#[inline]
fn cost(&self, domain: &D, val: &D::Value) -> f64 {
domain.cost(val)
}
#[inline]
fn min_cost(&self, domain: &D) -> f64 {
domain.min_cost()
}
#[inline]
fn max_cost(&self, domain: &D) -> f64 {
domain
.values()
.into_iter()
.map(|v| domain.cost(&v))
.fold(f64::NEG_INFINITY, f64::max)
}
}