use super::UnitSIdRef;
use serde::{Deserialize, Serialize};
#[derive(Deserialize, Debug, Serialize, Eq, PartialEq, Clone)]
pub struct Math {
#[serde(rename = "$value")]
pub content: MathNode,
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Clone)]
pub struct Apply {
#[serde(rename = "$value")]
pub content: Vec<MathNode>,
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Clone)]
pub struct Ci {
#[serde(rename = "$value")]
content: String,
#[serde(rename = "type")]
ci_type: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Clone)]
#[serde(rename = "lowercase")]
pub struct Bvar {
#[serde(rename = "$value")]
ci: Ci,
ci_type: Option<String>,
}
#[derive(Debug, Serialize, Eq, PartialEq, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub enum NumberType {
Real,
Integer,
Rational,
ComplexCartesian,
ComplexPolar,
Constant,
ENotation,
}
impl Default for NumberType {
fn default() -> Self {
Self::Real
}
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Clone)]
pub struct Base(pub u32);
impl Default for Base {
fn default() -> Self {
Base(10)
}
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Clone)]
#[serde(rename_all = "camelCase")]
pub struct Cn {
#[serde(rename = "$value")]
pub content: String,
#[serde(rename = "sbml:units")]
pub unit: Option<UnitSIdRef>,
#[serde(rename = "type", default)]
pub cn_type: NumberType,
#[serde(default)]
pub base: Base,
pub definition_url: Option<String>,
pub encoding: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Clone)]
#[serde(rename_all = "camelCase")]
pub enum MathNode {
Apply(Box<Apply>),
Text(String),
Ci {
#[serde(rename = "$value")]
content: String,
#[serde(rename = "type")]
ci_type: Option<String>,
},
Csymbol {
cd: Option<String>,
encoding: Option<String>,
#[serde(rename = "$value")]
children: Vec<MathNode>,
},
Cn(Cn),
Comment(String),
PI(String, Option<String>),
Lambda {
#[serde(rename = "$value")]
children: Vec<MathNode>,
},
Bvar,
Factorial,
Minus,
Abs,
Conjugate,
Arg,
Real,
Imaginary,
Floor,
Ceiling,
Not,
Inverse,
Ident,
Domain,
Codomain,
Image,
Sin,
Cos,
Tan,
Sec,
Csc,
Cot,
Sinh,
Cosh,
Tanh,
Sech,
Csch,
Coth,
Arcsin,
Arccos,
Arctan,
Arccosh,
Arccot,
Arccoth,
Arccsc,
Arccsch,
Arcsec,
Arcsech,
Arcsinh,
Arctanh,
Exp,
Ln,
Log,
Determinant,
Transpose,
Divergence,
Grad,
Curl,
Laplacian,
Card,
Quotient,
Divide,
Power,
Rem,
Implies,
Equivalent,
Approx,
Setdiff,
Vectorproduct,
Scalarproduct,
Outerproduct,
Plus,
Times,
Max,
Min,
Gcd,
Lcm,
Mean,
Sdev,
Variance,
Median,
Mode,
And,
Or,
Xor,
Selector,
Union,
Intersect,
Cartesianproduct,
Compose,
#[serde(rename = "fn")]
Fun,
Int,
Sum,
Product,
Diff,
Partialdiff,
Forall,
Exists,
Eq,
Neq,
Gt,
Lt,
Geq,
Leq,
Root,
}
impl MathNode {
pub fn apply(x: Vec<MathNode>) -> Self {
MathNode::Apply(Box::new(Apply { content: x }))
}
}