pub enum Expr {
Const(Number),
Var(usize),
Binary(BinOp, Box<Expr>, Box<Expr>),
Unary(UnaryOp, Box<Expr>),
Sum(Vec<Expr>),
Cse(Rc<Expr>),
Funcall {
id: usize,
args: Vec<FuncallArg>,
},
}Variants§
Const(Number)
Numeric constant.
Var(usize)
Variable reference (0-based index into x).
Binary(BinOp, Box<Expr>, Box<Expr>)
Binary op: args = [lhs, rhs].
Unary(UnaryOp, Box<Expr>)
Unary op.
Sum(Vec<Expr>)
n-ary sum (opcode o54 — variadic; we may emit it from o0
folding optimization, but the parser treats o0 as binary).
Cse(Rc<Expr>)
Reference to a common subexpression (.nl V segment). The
payload is a shared body; many references to the same CSE share
one Rc, so the parsed problem is a DAG. Walking through Cse
is mathematically equivalent to inlining the body at each
occurrence (every reference is an independent occurrence in the
chain rule), so eval/grad/collect_vars just recurse into the
inner Expr.
Funcall
AMPL imported (external) function call. id matches an entry in
NlProblem.imported_funcs; resolution to a live shared library
happens when the tape is built (see nl_external::ExternalResolver).
Trait Implementations§
Auto Trait Implementations§
impl Freeze for Expr
impl RefUnwindSafe for Expr
impl !Send for Expr
impl !Sync for Expr
impl Unpin for Expr
impl UnsafeUnpin for Expr
impl UnwindSafe for Expr
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more