use super::{
BinaryOp, Direction, InequalityOp, IntegralBounds, LogicalOp, MathConstant, MathFloat,
MultipleBounds, NumberSet, RelationOp, SetOp, SetRelation, TensorIndex, UnaryOp,
VectorNotation,
};
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Expression {
Integer(i64),
Float(MathFloat),
Rational {
numerator: Box<Expression>,
denominator: Box<Expression>,
},
Complex {
real: Box<Expression>,
imaginary: Box<Expression>,
},
Quaternion {
real: Box<Expression>,
i: Box<Expression>,
j: Box<Expression>,
k: Box<Expression>,
},
Variable(String),
Constant(MathConstant),
Binary {
op: BinaryOp,
left: Box<Expression>,
right: Box<Expression>,
},
Unary {
op: UnaryOp,
operand: Box<Expression>,
},
Function {
name: String,
args: Vec<Expression>,
},
Derivative {
expr: Box<Expression>,
var: String,
order: u32,
},
PartialDerivative {
expr: Box<Expression>,
var: String,
order: u32,
},
Integral {
integrand: Box<Expression>,
var: String,
bounds: Option<IntegralBounds>,
},
MultipleIntegral {
dimension: u8,
integrand: Box<Expression>,
bounds: Option<MultipleBounds>,
vars: Vec<String>,
},
ClosedIntegral {
dimension: u8,
integrand: Box<Expression>,
surface: Option<String>,
var: String,
},
Limit {
expr: Box<Expression>,
var: String,
to: Box<Expression>,
direction: Direction,
},
Sum {
index: String,
lower: Box<Expression>,
upper: Box<Expression>,
body: Box<Expression>,
},
Product {
index: String,
lower: Box<Expression>,
upper: Box<Expression>,
body: Box<Expression>,
},
Vector(Vec<Expression>),
Matrix(Vec<Vec<Expression>>),
Equation {
left: Box<Expression>,
right: Box<Expression>,
},
Inequality {
op: InequalityOp,
left: Box<Expression>,
right: Box<Expression>,
},
ForAll {
variable: String,
domain: Option<Box<Expression>>,
body: Box<Expression>,
},
Exists {
variable: String,
domain: Option<Box<Expression>>,
body: Box<Expression>,
unique: bool,
},
Logical {
op: LogicalOp,
operands: Vec<Expression>,
},
MarkedVector {
name: String,
notation: VectorNotation,
},
DotProduct {
left: Box<Expression>,
right: Box<Expression>,
},
CrossProduct {
left: Box<Expression>,
right: Box<Expression>,
},
OuterProduct {
left: Box<Expression>,
right: Box<Expression>,
},
Gradient {
expr: Box<Expression>,
},
Divergence {
field: Box<Expression>,
},
Curl {
field: Box<Expression>,
},
Laplacian {
expr: Box<Expression>,
},
Nabla,
Determinant {
matrix: Box<Expression>,
},
Trace {
matrix: Box<Expression>,
},
Rank {
matrix: Box<Expression>,
},
ConjugateTranspose {
matrix: Box<Expression>,
},
MatrixInverse {
matrix: Box<Expression>,
},
NumberSetExpr(NumberSet),
SetOperation {
op: SetOp,
left: Box<Expression>,
right: Box<Expression>,
},
SetRelationExpr {
relation: SetRelation,
element: Box<Expression>,
set: Box<Expression>,
},
SetBuilder {
variable: String,
domain: Option<Box<Expression>>,
predicate: Box<Expression>,
},
EmptySet,
PowerSet {
set: Box<Expression>,
},
Tensor {
name: String,
indices: Vec<TensorIndex>,
},
KroneckerDelta {
indices: Vec<TensorIndex>,
},
LeviCivita {
indices: Vec<TensorIndex>,
},
FunctionSignature {
name: String,
domain: Box<Expression>,
codomain: Box<Expression>,
},
Composition {
outer: Box<Expression>,
inner: Box<Expression>,
},
Differential {
var: String,
},
WedgeProduct {
left: Box<Expression>,
right: Box<Expression>,
},
Relation {
op: RelationOp,
left: Box<Expression>,
right: Box<Expression>,
},
}