oCAS's Rust API uses a layered crate architecture. The top-level ocas crate re-exports all commonly used types and functions through its prelude module, so a single import is all you need:
#![allow(unused)]
fn main() {
use ocas::prelude::*;
}
graph TD
OC["ocas<br/>top-level entry point + prelude"]
CORE["ocas-core<br/>Arena, errors, fuel"]
DOMAIN["ocas-domain<br/>coefficient domains, number theory, algebraic number fields"]
ATOM["ocas-atom<br/>expression trees, tensors"]
PARSE["ocas-parse<br/>string parsing"]
POLY["ocas-poly<br/>polynomials, matrices, Gröbner bases"]
REWRITE["ocas-rewrite<br/>pattern matching, simplification, rewriting"]
CALC["ocas-calc<br/>calculus, ODEs, solvers"]
EVAL["ocas-eval<br/>evaluator, JIT, numeric integration"]
OC --> CORE
OC --> DOMAIN
OC --> ATOM
OC --> PARSE
OC --> POLY
OC --> REWRITE
OC --> CALC
OC --> EVAL
ATOM --> CORE
ATOM --> DOMAIN
PARSE --> CORE
PARSE --> ATOM
POLY --> CORE
POLY --> DOMAIN
REWRITE --> CORE
REWRITE --> ATOM
REWRITE --> PARSE
CALC --> CORE
CALC --> DOMAIN
CALC --> ATOM
CALC --> POLY
CALC --> REWRITE
EVAL --> CORE
EVAL --> ATOM
EVAL --> DOMAIN
style OC fill:#4a9eff,stroke:#2d7ad4,color:#fff
style CORE fill:#6c757d,stroke:#545b62,color:#fff
style DOMAIN fill:#28a745,stroke:#1e7e34,color:#fff
style ATOM fill:#17a2b8,stroke:#117a8b,color:#fff
style PARSE fill:#6f42c1,stroke:#59359a,color:#fff
style POLY fill:#fd7e14,stroke:#ca6510,color:#fff
style REWRITE fill:#e83e8c,stroke:#b82d6e,color:#fff
style CALC fill:#20c997,stroke:#17a085,color:#fff
style EVAL fill:#ffc107,stroke:#d39e00,color:#333
Crate Responsibility
ocas-coreArena bump allocator, unified error type OcasError, fuel counter Fuel
ocas-domainCoefficient-domain traits (Domain, EuclideanDomain) and implementations (integers, rationals, finite fields, real balls, complex numbers, double-precision floats, algebraic number fields), number-theory function library, hyper-dual automatic differentiation
ocas-atomExpression tree (Atom, AtomNode, AtomArena), hash-consing, tensor system
ocas-parseString → Atom parser
ocas-polyPolynomials (dense univariate, sparse multivariate, rational function fields), matrices, Gröbner-basis algorithms (Buchberger/F4/F5), ideal operations, FGLM order conversion
ocas-rewritePattern matching (AC matching), simplification (fixed-point iteration), bottom-up transformation, E-graph (optional)
ocas-calcSymbolic differentiation, integration (Risch pipeline), Taylor expansion, ODE solving, Diophantine/linear/polynomial-system solvers
ocas-evalStack-VM interpreter, JIT compilation (Cranelift), SIMD batch evaluation, Vegas Monte Carlo numeric integration
use ocas::prelude::* imports all of the following items. The most commonly used types can also be accessed directly as ocas::TypeName.
Name Kind Description
Atomstruct Copy handle pointing to an expression node in the arena
AtomArenastruct Hash-consing constructor that builds expressions from an Arena
AtomNodeenum Node variants: Num/Var/Fun/Add/Mul/Pow
Symbolstruct Interned string identifier, Copy
normalizefn Normalizes an expression (sorting, merging like terms)
parsefn Parses a string into an Atom
ParseErrorenum Parse error
Name Kind Description
Domaintrait Basic coefficient-domain arithmetic (zero/one/add/mul/sub/neg, etc.)
EuclideanDomaintrait Euclidean domain (+ div_rem/gcd/lcm)
Integerstruct Arbitrary-precision integer
IntegerDomainstruct Integer domain implementation
Rationalstruct Arbitrary-precision rational number
RationalDomainstruct Rational number field implementation
FiniteFieldstruct 𝔽ₚ finite field
FiniteFieldElementstruct Finite-field element
RealBallstruct Real ball arithmetic (requires the mpfr feature)
RealBallDomainstruct Real ball domain implementation
Complexstruct Complex number
ComplexDomainstruct Complex number field implementation
DoubleF64struct Double-precision float (~31 significant digits)
DoubleF64Domainstruct Double-precision float domain implementation
AlgebraicExtensionstruct Algebraic number field ℚ(α) or GF(p^d)
AlgebraicElementstruct Algebraic number field element
AlgebraicNumberFieldstruct Algebraic number field constructor
Assumptionenum Assumption variants (Positive/Negative/Integer/Real/Complex, and 8 more)
Assumptionsstruct Assumption set
SymbolAssumptionsstruct Per-symbol assumption management
Name Kind Description
DenseUnivariatePolynomialstruct Dense univariate polynomial
SparseMultivariatePolynomialstruct Sparse multivariate polynomial
RationalPolynomialstruct Element p/q of a rational function field
RootIntervalstruct An interval containing exactly one real root (low/high bounds)
MonomialOrdertrait Monomial order trait
Lexstruct Lexicographic order
Grlexstruct Graded lexicographic order
Grevlexstruct Graded reverse lexicographic order
WeightOrderstruct Weighted order
BlockOrderstruct Block elimination order
SubOrderstruct Sub-order
monomial_dividesfn Monomial divisibility test
monomial_lcmfn Monomial least common multiple
monomial_are_coprimefn Monomial coprimality test
Name Kind Description
Matrixstruct Matrix over a domain (Bareiss determinant, Gaussian-elimination solving)
MatrixErrorenum Matrix operation error
Name Kind Description
GroebnerBasisstruct Gröbner-basis result (polynomial list plus metadata)
buchbergerfn Buchberger algorithm entry point
f4fn F4 algorithm entry point (matrix row-echelon batching)
Name Kind Description
difffn Symbolic differentiation
integratefn Symbolic integration (layered pipeline)
integrate_outcomefn Certified integration: three-valued outcome + symbolic certificate (0.28.0)
integrate_outcome_with_optionsfn Certified integration with options (0.28.0)
integrate_heuristicfn Heuristic integration (without Risch)
integrate_with_fuelfn Integration with a fuel limit
taylorfn Taylor expansion
substitutefn Expression substitution
apartfn Partial-fraction decomposition
Name Kind Description
solve_linear_rationalfn Linear system Ax=b over ℚ
solve_linear_integerfn Linear system Ax=b over ℤ
solve_diophantinefn Diophantine equation ax+by=c
DiophantineSolutionstruct Diophantine solution (particular solution + steps)
SolveErrorenum Solve error
solve_polynomial_systemfn Polynomial system solving (zero-dimensional / positive-dimensional / empty)
classify_odefn ODE type classification
dsolvefn Symbolic ODE solving
dsolve_ivpfn ODE initial-value problem (Laplace)
dsolve_systemfn 2×2 ODE system solving
ODEstruct ODE description
ODESolutionenum ODE solution (explicit/implicit/parametric/series/system/unsolved)
ODETypeenum ODE type enumeration
Name Kind Description
Patternenum Match pattern (Literal/Wildcard/Add/Mul/Pow/Fun)
Rulestruct Rewrite rule
Bindingsstruct Pattern binding results
MatchErrorenum Match error (incl. BudgetExhausted)
WildcardLevelenum Wildcard level (Single/Sequence/NullSequence)
match_patternfn AC pattern matching
simplifyfn Fixed-point simplification
simplify_with_fuelfn Simplification with a fuel limit
transformfn Bottom-up transformation
Name Kind Description
ExpressionEvaluatorstruct Stack-VM interpreter
FunctionMapstruct Custom function registry
EvaluationDomaintrait Evaluation-domain constraint
EvaluationErrorenum Evaluation error
EvalTreestruct Evaluation tree
Instrenum Instruction enum
Instructionstruct Instruction details
Slotenum Operand slot (Param/Const/Temp)
PowfExtensiontrait Floating-point power extension
VectorEvaluatorstruct SIMD batch evaluation (requires the simd feature)
JitEnginestruct JIT compilation engine (requires the jit feature)
JitCompiledFunctionstruct JIT compilation result
Name Kind Description
Vegasstruct Vegas Monte Carlo integrator
VegasOptionsstruct Vegas options (bin count, sample count, iterations, etc.)
IntegrateResultstruct Integration result (value + error)
Integratorstruct Integrator interface
StatisticsAccumulatorstruct Inverse-variance weighted accumulator
integrate_1dfn 1-D numeric integration convenience function
Name Kind Description
DualShapestruct Derivative layout description
HyperDualstruct Hyper-dual number
DualCoefftrait Dual coefficient constraint
new_first_orderfn First-order dual convenience constructor
Name Kind Description
Tensorstruct Named-index tensor
IndexSlotstruct Index slot (label + position)
IndexPositionenum Upper (contravariant) / Lower (covariant)
Symmetryenum None/Symmetric/Antisymmetric
Contractedenum Contraction result (Scalar/Product)
TensorProductstruct Tensor product
contractfn Index contraction
symmetrise_signfn Antisymmetrization sign
Name Kind Description
Arenastruct Bump allocator
OcasErrorenum Unified error type
Resulttype Result<T, OcasError>
Fuelstruct Fuel counter (prevents infinite loops)
Enable optional backends and acceleration features via the features key in Cargo.toml:
[dependencies]
ocas = { version = "0.24", features = ["gmp", "jit"] }
Feature Default Description Sub-crate features involved
gmpno Use GMP arbitrary-precision arithmetic (significantly speeds up big-integer operations) ocas-domain/gmp, ocas-poly/gmp, ocas-core/gmp
mpfrno Enable MPFR real ball arithmetic (the RealBall type) ocas-domain/mpfr
flintno Use the FLINT number-theory library to accelerate polynomial operations ocas-poly/flint
pythonno Enable Python bindings (PyO3) dep:ocas-py
gplno Enable GPL-licensed feature modules dep:ocas-gpl
eggno Enable E-graph simplification (the egg_simplify function) ocas-rewrite/egg
jitno Enable Cranelift JIT compilation (the compile_jit method) ocas-eval/jit
simdno Enable SIMD batch evaluation (VectorEvaluator) ocas-eval/simd
mimallocno Use the mimalloc global allocator (accelerates many-small-allocation workloads) dep:mimalloc
system-libsno Link against preinstalled system GMP/MPFR/MPC (required on MinGW) ocas-domain/system-libs
nttno NTT number-theoretic transform acceleration for polynomial multiplication over 𝔽ₚ ocas-poly/ntt
sprsno Sparse matrix backend (used for the F4 prep phase) ocas-poly/sprs
fast-polyno fast_polynomial Estrin evaluation acceleration ocas-eval/fast-poly
Tip : default = [] — all backends are off by default for maximum portability (including Windows MSVC). Recommended development configuration: features = ["gmp", "jit"].
Topic File Contents
Expression system rust-expressions Arena, Atom, AtomArena, Symbol, pattern matching, parsing
Coefficient domains rust-domains Domain trait, integers/rationals/finite fields/real balls/complex/doubles/algebraic number fields, assumption system
Polynomials rust-polynomials Dense univariate, sparse multivariate, rational function fields, monomial orders
Matrices rust-matrix Matrix (Bareiss determinant, Gaussian elimination)
Calculus rust-calculus diff, integrate, taylor, integration pipeline layers
Solvers rust-solvers Linear systems, Diophantine equations, polynomial systems, ODE solving
Rewriting & simplification rust-rewrite Pattern, Rule, simplify, transform, E-graph
Evaluation & JIT rust-evaluation ExpressionEvaluator, JIT, SIMD, FunctionMap
Automatic differentiation rust-autodiff DualShape, HyperDual, DualCoeff
Tensors rust-tensors Tensor, contraction, symmetry, canonicalization, Young projection
Number theory rust-ntheory Primality, factorization, discrete logarithms, CRT, number-theoretic functions, quadratic residues
Gröbner bases & ideals rust-groebner Buchberger/F4/F5, FGLM, ideal operations, primary decomposition
Factoring rust-factoring Univariate/multivariate ℤ[x]/𝔽ₚ[x] factoring, algebraic number fields, rational functions
Numeric integration rust-numeric-integration.md Vegas Monte Carlo, integrate_1d
use ocas::prelude::*;
use ocas_core::arena::Arena;
fn main() {
// 1. Create the arena and expression context
let arena = Arena::new();
let ctx = AtomArena::new(&arena);
// 2. Build the expression sin(x)
let x = ctx.var("x");
let expr = ctx.fun("sin", &[x]);
// 3. Differentiate symbolically (diff takes a Symbol as the variable)
let deriv = diff(&ctx, expr, Symbol::new("x"));
assert_eq!(deriv.to_string(), "cos(x)");
// 4. Simplify (an empty rule set keeps the expression unchanged)
let simplified = simplify(&ctx, expr, &[], 100);
assert_eq!(simplified.to_string(), "sin(x)");
println!("d/dx sin(x) = {}", deriv);
}