#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum WcojVarOrderingKind {
Disabled,
LeaderCardinality,
HeatAware,
}
#[derive(Debug, Clone, PartialEq)]
pub struct CompilerConfig {
pub wcoj_variable_ordering: WcojVarOrderingKind,
pub wcoj_var_ordering_threshold: f64,
}
impl Default for CompilerConfig {
fn default() -> Self {
Self {
wcoj_variable_ordering: WcojVarOrderingKind::Disabled,
wcoj_var_ordering_threshold: Self::DEFAULT_THRESHOLD,
}
}
}
impl CompilerConfig {
pub const DEFAULT_THRESHOLD: f64 = 0.5;
pub fn effective_wcoj_var_ordering_threshold(&self) -> f64 {
let t = self.wcoj_var_ordering_threshold;
if !t.is_finite() || t <= 0.0 || t > 1.0 {
Self::DEFAULT_THRESHOLD
} else {
t
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_threshold_is_half() {
let c = CompilerConfig::default();
assert_eq!(c.wcoj_var_ordering_threshold, 0.5);
assert_eq!(c.effective_wcoj_var_ordering_threshold(), 0.5);
assert_eq!(c.wcoj_variable_ordering, WcojVarOrderingKind::Disabled);
}
#[test]
fn resolver_passes_through_valid_in_range() {
let c = CompilerConfig {
wcoj_var_ordering_threshold: 0.3,
..CompilerConfig::default()
};
assert_eq!(c.effective_wcoj_var_ordering_threshold(), 0.3);
}
#[test]
fn resolver_clamps_zero_and_negative_to_default() {
let zero = CompilerConfig {
wcoj_var_ordering_threshold: 0.0,
..CompilerConfig::default()
};
assert_eq!(
zero.effective_wcoj_var_ordering_threshold(),
CompilerConfig::DEFAULT_THRESHOLD
);
let neg = CompilerConfig {
wcoj_var_ordering_threshold: -0.5,
..CompilerConfig::default()
};
assert_eq!(
neg.effective_wcoj_var_ordering_threshold(),
CompilerConfig::DEFAULT_THRESHOLD
);
}
#[test]
fn resolver_clamps_above_one_and_nonfinite_to_default() {
let above = CompilerConfig {
wcoj_var_ordering_threshold: 1.5,
..CompilerConfig::default()
};
assert_eq!(
above.effective_wcoj_var_ordering_threshold(),
CompilerConfig::DEFAULT_THRESHOLD
);
let nan = CompilerConfig {
wcoj_var_ordering_threshold: f64::NAN,
..CompilerConfig::default()
};
assert_eq!(
nan.effective_wcoj_var_ordering_threshold(),
CompilerConfig::DEFAULT_THRESHOLD
);
let inf = CompilerConfig {
wcoj_var_ordering_threshold: f64::INFINITY,
..CompilerConfig::default()
};
assert_eq!(
inf.effective_wcoj_var_ordering_threshold(),
CompilerConfig::DEFAULT_THRESHOLD
);
}
}