pub mod affine;
pub mod builtins;
pub mod constraint;
pub mod known;
pub mod lint_sink;
pub mod mag;
pub mod partial;
pub mod rational;
pub mod unit_simplify;
pub mod units;
pub mod value;
use crate::diag::Diag;
use crate::parser::Expr;
use crate::registry::Registry;
use crate::resolver::Resolver;
pub use lint_sink::LintSink;
pub use mag::Mag;
pub use value::Value;
pub use known::PARALLEL_THRESHOLD;
#[cfg(feature = "parallel")]
use rayon::prelude::*;
#[derive(Debug, Clone)]
pub struct EvalOutcome {
pub value: Result<Value, Diag>,
pub lints: Vec<Diag>,
}
pub fn eval(expr: &Expr, registry: &Registry, resolver: &dyn Resolver) -> Result<Value, Diag> {
eval_checked(expr, registry, resolver).value
}
pub fn eval_checked(
expr: &Expr,
registry: &Registry,
resolver: &dyn Resolver,
) -> EvalOutcome {
let mut lints = LintSink::new();
let value = known::eval_known_checked(expr, registry, resolver, &mut lints);
EvalOutcome {
value,
lints: lints.into_lints(),
}
}
#[cfg(feature = "parallel")]
pub fn eval_batch<'a>(
exprs: impl rayon::iter::IntoParallelIterator<Item = &'a Expr>,
registry: &Registry,
resolver: &dyn Resolver,
) -> Vec<Result<Value, Diag>> {
exprs
.into_par_iter()
.map(|expr| eval(expr, registry, resolver))
.collect()
}
#[cfg(feature = "parallel")]
pub fn eval_scenarios(
expr: &Expr,
registry: &Registry,
scenarios: impl rayon::iter::IntoParallelIterator<Item = Box<dyn Resolver>>,
) -> Vec<Result<Value, Diag>> {
scenarios
.into_par_iter()
.map(|resolver| eval(expr, registry, resolver.as_ref()))
.collect()
}