#![warn(missing_docs)]
pub mod bdd;
pub mod delta_rational;
pub mod grobner;
pub mod hilbert;
pub mod interior_point;
pub mod interval;
pub mod lp;
pub mod matrix;
pub mod polynomial;
pub mod rational;
pub mod rational_function;
pub mod realclosure;
pub mod simplex;
#[cfg(test)]
mod integration_tests {
use super::*;
use num_bigint::BigInt;
use num_rational::BigRational;
fn rat(n: i64) -> BigRational {
BigRational::from_integer(BigInt::from(n))
}
#[test]
fn test_grobner_with_root_isolation() {
let x_squared_minus_2 = polynomial::Polynomial::from_coeffs_int(&[
(1, &[(0, 2)]), (-2, &[]), ]);
let y_minus_x = polynomial::Polynomial::from_coeffs_int(&[
(1, &[(1, 1)]), (-1, &[(0, 1)]), ]);
let gb = grobner::grobner_basis(&[x_squared_minus_2.clone(), y_minus_x]);
assert!(!gb.is_empty());
let has_univariate = gb.iter().any(|p| p.is_univariate());
assert!(has_univariate || gb.len() == 1);
}
#[test]
fn test_nra_solver_with_algebraic_numbers() {
let mut solver = grobner::NraSolver::new();
let x_squared_minus_2 = polynomial::Polynomial::from_coeffs_int(&[
(1, &[(0, 2)]), (-2, &[]), ]);
solver.add_equality(x_squared_minus_2.clone());
assert_eq!(solver.check_sat(), grobner::SatResult::Sat);
let sqrt_2 = realclosure::AlgebraicNumber::new(
x_squared_minus_2,
0, rat(1),
rat(2),
);
let _ = sqrt_2;
}
#[test]
fn test_interval_with_polynomial_bounds() {
let x_squared = polynomial::Polynomial::from_coeffs_int(&[(1, &[(0, 2)])]);
let mut assignment1 = rustc_hash::FxHashMap::default();
assignment1.insert(0, rat(1));
let val1 = x_squared.eval(&assignment1);
assert_eq!(val1, rat(1));
let mut assignment2 = rustc_hash::FxHashMap::default();
assignment2.insert(0, rat(2));
let val2 = x_squared.eval(&assignment2);
assert_eq!(val2, rat(4));
let interval = interval::Interval::closed(rat(1), rat(4));
assert!(interval.contains(&val1));
assert!(interval.contains(&val2));
}
#[test]
fn test_delta_rationals_ordering() {
let delta_zero = delta_rational::DeltaRational::from_rational(rat(0));
let delta_small = delta_rational::DeltaRational::new(rat(0), 1);
assert!(delta_small > delta_zero);
let delta_one = delta_rational::DeltaRational::from_rational(rat(1));
assert!(delta_one > delta_small);
}
#[test]
fn test_matrix_operations() {
use matrix::Matrix;
use num_rational::Rational64;
let m = Matrix::from_vec(
2,
2,
vec![
Rational64::new(2, 1),
Rational64::new(1, 1),
Rational64::new(1, 1),
Rational64::new(1, 1),
],
);
assert_eq!(m.get(0, 0), Rational64::new(2, 1));
assert_eq!(m.get(0, 1), Rational64::new(1, 1));
}
#[test]
fn test_polynomial_factorization_with_grobner() {
let x_sq_minus_y_sq = polynomial::Polynomial::from_coeffs_int(&[
(1, &[(0, 2)]), (-1, &[(1, 2)]), ]);
let gb = grobner::grobner_basis(&[x_sq_minus_y_sq]);
assert!(!gb.is_empty());
}
#[test]
fn test_real_closure_root_isolation_integration() {
let poly = polynomial::Polynomial::from_coeffs_int(&[
(1, &[(0, 3)]), (-2, &[]), ]);
let roots = poly.isolate_roots(0);
assert!(!roots.is_empty());
}
#[test]
fn test_polynomial_gcd_univariate() {
let p1 = polynomial::Polynomial::from_coeffs_int(&[
(1, &[(0, 2)]), (-1, &[]), ]);
let p2 = polynomial::Polynomial::from_coeffs_int(&[
(1, &[(0, 1)]), (-1, &[]), ]);
let gcd = p1.gcd_univariate(&p2);
assert_eq!(gcd.total_degree(), 1);
}
}