pub mod compute;
pub mod cached_compute;
pub mod enhanced_compute;
pub mod simplify;
pub mod enhanced_simplify;
pub mod calculus;
pub mod algebra;
pub mod polynomial;
pub mod number_theory;
pub mod matrix;
pub mod cache;
pub mod lazy;
pub mod parallel;
pub mod runtime_enhancement;
pub mod runtime_enhanced_engine;
pub mod error;
#[cfg(test)]
mod matrix_tests;
use std::collections::HashMap;
use crate::core::{Expression, Number, MathConstant};
pub use error::{ComputeError, ErrorSeverity};
pub use cache::{ComputeCache, CacheManager, CacheStats, CacheUsageInfo};
pub use cached_compute::CachedComputeEngine;
pub use enhanced_compute::EnhancedComputeEngine;
pub use lazy::{LazyExpression, DependencyGraph, LazyState, DependencyGraphStats};
pub use parallel::{ParallelComputeEngine, TaskScheduler, ComputeTask, SchedulerStats, ExpressionPreprocessor, ParallelizationAnalysis};
pub use matrix::MatrixEngine;
pub use enhanced_simplify::EnhancedSimplifier;
pub use runtime_enhancement::{RuntimeEnhancer, VariableManager, ComplexityAnalyzer, RuntimeConfig};
pub use runtime_enhanced_engine::RuntimeEnhancedEngine;
pub trait ComputeEngine: Send + Sync {
fn as_any(&self) -> &dyn std::any::Any;
fn simplify(&self, expr: &Expression) -> Result<Expression, ComputeError>;
fn evaluate(&self, expr: &Expression, vars: &HashMap<String, Number>)
-> Result<Number, ComputeError>;
fn differentiate(&self, expr: &Expression, var: &str)
-> Result<Expression, ComputeError>;
fn integrate(&self, expr: &Expression, var: &str)
-> Result<Expression, ComputeError>;
fn limit(&self, expr: &Expression, var: &str, point: &Expression)
-> Result<Expression, ComputeError>;
fn series(&self, expr: &Expression, var: &str, point: &Expression, order: usize)
-> Result<Expression, ComputeError>;
fn numerical_evaluate(&self, expr: &Expression, vars: &HashMap<String, f64>)
-> Result<f64, ComputeError>;
fn constant_to_number(&self, constant: &MathConstant) -> Result<Number, ComputeError>;
fn simplify_constants(&self, expr: &Expression) -> Result<Expression, ComputeError>;
fn expand(&self, expr: &Expression) -> Result<Expression, ComputeError>;
fn factor(&self, expr: &Expression) -> Result<Expression, ComputeError>;
fn collect(&self, expr: &Expression, var: &str) -> Result<Expression, ComputeError>;
fn polynomial_divide(&self, dividend: &Expression, divisor: &Expression)
-> Result<(Expression, Expression), ComputeError>;
fn polynomial_gcd(&self, a: &Expression, b: &Expression) -> Result<Expression, ComputeError>;
fn gcd(&self, a: &Expression, b: &Expression) -> Result<Expression, ComputeError>;
fn lcm(&self, a: &Expression, b: &Expression) -> Result<Expression, ComputeError>;
fn is_prime(&self, n: &Expression) -> Result<bool, ComputeError>;
fn prime_factors(&self, n: &Expression) -> Result<Vec<Expression>, ComputeError>;
fn binomial(&self, n: &Expression, k: &Expression) -> Result<Expression, ComputeError>;
fn permutation(&self, n: &Expression, k: &Expression) -> Result<Expression, ComputeError>;
fn mean(&self, values: &[Expression]) -> Result<Expression, ComputeError>;
fn variance(&self, values: &[Expression]) -> Result<Expression, ComputeError>;
fn standard_deviation(&self, values: &[Expression]) -> Result<Expression, ComputeError>;
fn solve(&self, equation: &Expression, var: &str) -> Result<Vec<Expression>, ComputeError>;
fn solve_system(&self, equations: &[Expression], vars: &[String])
-> Result<Vec<HashMap<String, Expression>>, ComputeError>;
fn matrix_add(&self, a: &Expression, b: &Expression) -> Result<Expression, ComputeError>;
fn matrix_multiply(&self, a: &Expression, b: &Expression) -> Result<Expression, ComputeError>;
fn matrix_determinant(&self, matrix: &Expression) -> Result<Expression, ComputeError>;
fn matrix_inverse(&self, matrix: &Expression) -> Result<Expression, ComputeError>;
fn complex_conjugate(&self, expr: &Expression) -> Result<Expression, ComputeError>;
fn complex_modulus(&self, expr: &Expression) -> Result<Expression, ComputeError>;
fn complex_argument(&self, expr: &Expression) -> Result<Expression, ComputeError>;
fn vector_dot(&self, a: &Expression, b: &Expression) -> Result<Expression, ComputeError>;
fn vector_cross(&self, a: &Expression, b: &Expression) -> Result<Expression, ComputeError>;
fn vector_norm(&self, v: &Expression) -> Result<Expression, ComputeError>;
fn set_union(&self, a: &Expression, b: &Expression) -> Result<Expression, ComputeError>;
fn set_intersection(&self, a: &Expression, b: &Expression) -> Result<Expression, ComputeError>;
fn set_difference(&self, a: &Expression, b: &Expression) -> Result<Expression, ComputeError>;
}