oximo-expr
Arena-allocated expression tree for oximo.
All expressions in oximo are nodes in a single ExprArena owned by the Model. User code holds lightweight Expr handles, a (ExprId, &RefCell<ExprArena>) pair. Copying an Expr copies an ID, not a subtree. Operator overloads collapse linear combinations into a single Linear node so LP/MILP construction never traverses an Add(Mul(Const, Var), ...) tree.
This crate is the fundamental layer. End users depend on oximo-core, which re-exports all types from here so a separate oximo-expr import is not needed.
Key types
| Type | Description |
|---|---|
ExprArena |
Backing store, a typed Vec<ExprNode> |
ExprId |
Newtype u32 index into an arena |
ExprNode |
Enum of all node kinds (see below) |
Expr<'a> |
Lightweight handle: id + borrow of the arena. Copy. |
VarId |
Opaque variable index |
ParamId |
Opaque parameter index |
LinearTerms |
Extracted Vec<(VarId, f64)> + constant |
ExprNode variants
Const
Var
Param
Add // generic n-ary add
Mul // generic n-ary mul
Neg
Pow
Sin / Cos / Exp / Log
Linear // LP fast-path
Linear is produced automatically by operator overloads when all operands are linear. LP/MILP backends detect it and skip tree traversal entirely.
Operator overloads
Expr implements Add, Sub, Mul, Neg against other Expr values and against f64. All operations that stay linear produce a Linear node. For example:
// All of these produce a single Linear node, not an Add/Mul tree:
let e = 2.0 * x + 3.0 * y - 1.0;
let e = x + y;
let e = -x;
Nonlinear methods on Expr
expr.pow // Expr ^ Expr
expr.powi // integer exponent shorthand
expr.powf // float exponent shorthand
expr.sin
expr.cos
expr.exp
expr.log
Utilities
sum
use sum;
let total = sum;
Accumulates an iterator of Expr into a single linear expression.
extract_linear
use extract_linear;
let terms: = extract_linear;
Returns Some(LinearTerms) if the subtree is affine, None if it contains nonlinear nodes. Used by backends and oximo-io to validate and serialize models.
evaluate
use ;
let mut ctx = new;
ctx.set_var;
let val: f64 = evaluate?;
Numerically evaluates an expression subtree given variable assignments.
simplify
use simplify;
let simplified_id = simplify;
Constant-folds and simplifies the subtree in place.
Visitor / walk
use ;
;
walk;
Depth-first traversal for custom analysis passes.
Usage
End users do not need to depend on this crate directly. Depend on oximo-core instead, it re-exports all types from oximo-expr.
To use this crate directly (e.g. for a custom backend):
[]
= "0.1"
License
MIT OR Apache-2.0