ommx 3.0.0-beta.2

Open Mathematical prograMming eXchange (OMMX)
Documentation
use crate::Bound;

pub(super) const MAX_EXACT_ENCODING_INTEGER: f64 = (1_u64 << 53) as f64;

pub(super) fn ensure_unit_spaced_integer_bound(
    integer_bound: Bound,
    encoding_name: &str,
) -> crate::Result<()> {
    if integer_bound.width() == 0.0 {
        return Ok(());
    }

    let lower = integer_bound.lower();
    let upper = integer_bound.upper();
    if lower < -MAX_EXACT_ENCODING_INTEGER || upper > MAX_EXACT_ENCODING_INTEGER {
        crate::bail!(
            { ?integer_bound, lower, upper, max_exact_integer = MAX_EXACT_ENCODING_INTEGER },
            "integer bound is too far from zero for {encoding_name}: non-point range [{lower}, {upper}] cannot be represented as unit-spaced f64 integers",
        );
    }
    Ok(())
}