diff --git a/TODO.md b/TODO.md
index c3674d66..b878577d 100644
--- a/TODO.md
+++ b/TODO.md
@@ -28,7 +28,7 @@
[ ] dat (DBSolve)
[ ] ModelingToolkit (Julia)
[ ] PGF and TikZ
-[ ] Statistics
+[x] Statistics
## bugs
@@ -36,11 +36,9 @@
## features
- check and warning if core component was replaced
-- checking units for diff eq
- AnyUnit for zero numbers
- atStart to exports: Matlab, DBSolve
-- checking legal functions inside Expressions and functionDefinition
-- `#defineFunction`: different exports, functionDef vs units
+- `#defineFunction`: different exports
- write reusable `Build` class
## ideas
diff --git a/export-formats.md b/export-formats.md
index 67764d72..46b106b5 100644
--- a/export-formats.md
+++ b/export-formats.md
@@ -505,8 +505,8 @@ _Conversion to SBML's MathML_
|`t`|`t`|
|`a and b`|`(a) (b)`|
|`a or b`|`(a) (b)`|
-|`a xor b`|`(a) (b)`|
-|`not a`|`(a)`|
+|`a xor b`|`(a) (b)`|
+|`not a`|`(a)`|
|`b1 < b2 ? x : y`|`(x)(b1) (b2)(y)`|
|`piecewise(value1, cond1, value2, cond2, ..., otherwise)`|`(value1) (cond1)(value2) (cond2)(otherwise)`|
|`acos(x)`, `acot(x)`, `acsc(x)`,`asec(x)`, `asin(x)`, `atan(x)`, `cos(x)`, `cot(x)`, `csc(x)`, `sec(x)`, `sin(x)`, `tan(x)`|`(x)`...|
diff --git a/src/module-system/sbml-parse.js b/src/module-system/sbml-parse.js
index 9e499391..1798c2d1 100644
--- a/src/module-system/sbml-parse.js
+++ b/src/module-system/sbml-parse.js
@@ -198,10 +198,8 @@ function unitDefinitionToUnits(x){
*/
function functionDefinitionToQ(x){
- let mathElement = x.elements
- && x.elements.find((y) => y.name === 'math');
- let lambdaElement = mathElement.elements
- && mathElement.elements.find((y) => y.name === 'lambda');
+ let mathElement = x.elements?.find((y) => y.name === 'math');
+ let lambdaElement = mathElement?.elements?.find((y) => y.name === 'lambda');
// get argument ids
let args = lambdaElement.elements && lambdaElement.elements
@@ -239,12 +237,10 @@ function baseToQ(x){
let sboTerm = x.attributes?.sboTerm;
if (sboTerm !== undefined) q.aux.sboTerm = sboTerm;
// take only first notes
- let notes = x.elements
- && x.elements.find((y) => y.name === 'notes');
+ let notes = x.elements?.find((y) => y.name === 'notes');
if (notes) q.notes = _toMarkdown(notes.elements);
// annotation
- let annotation = x.elements
- && x.elements.find((y) => y.name === 'annotation');
+ let annotation = x.elements?.find((y) => y.name === 'annotation');
if (annotation) q.aux.annotation = _toAux(annotation.elements);
return q;
@@ -437,13 +433,10 @@ function reactionToQ(x){
q.class = 'Reaction';
- let kineticLaw = x.elements
- && x.elements.find((y) => y.name === 'kineticLaw');
+ let kineticLaw = x.elements?.find((y) => y.name === 'kineticLaw');
// local parameters
- let listOfParameters = kineticLaw
- && kineticLaw.elements
- && kineticLaw.elements.find((y) => y.name === 'listOfParameters');
+ let listOfParameters = kineticLaw?.elements?.find((y) => y.name === 'listOfParameters');
if (listOfParameters) {
let parameters = listOfParameters.elements
.filter((y) => y.name = 'parameter');
@@ -461,9 +454,7 @@ function reactionToQ(x){
});
}
// math
- let math = kineticLaw
- && kineticLaw.elements
- && kineticLaw.elements.find((y) => y.name === 'math');
+ let math = kineticLaw?.elements?.find((y) => y.name === 'math');
if (math) {
let expr = _toMathExpr(math);
localConstTranslate.forEach((y) => {
@@ -484,9 +475,8 @@ function reactionToQ(x){
}
// products
- let products = x.elements
- && x.elements.find((y) => y.name === 'listOfProducts');
- if (products.elements !== undefined) {
+ let products = x.elements?.find((y) => y.name === 'listOfProducts');
+ if (products?.elements) {
var actors0 = products.elements
.filter((y) => y.name === 'speciesReference')
.map((y) => {
@@ -508,9 +498,8 @@ function reactionToQ(x){
}
// reactants
- let reactants = x.elements
- && x.elements.find((y) => y.name === 'listOfReactants');
- if (reactants.elements !== undefined) {
+ let reactants = x.elements?.find((y) => y.name === 'listOfReactants');
+ if (reactants?.elements) {
var actors1 = reactants.elements
.filter((y) => y.name === 'speciesReference')
.map((y) => {
@@ -643,11 +632,8 @@ function eventToQ(x){
let useValuesFromTriggerTime = x.attributes?.useValuesFromTriggerTime !== 'false';
// trigger
- let trigger = x.elements
- && x.elements.find((y) => y.name === 'trigger');
- let triggerMath = trigger
- && trigger.elements
- && trigger.elements.find((y) => y.name === 'math');
+ let trigger = x.elements?.find((y) => y.name === 'trigger');
+ let triggerMath = trigger?.elements?.find((y) => y.name === 'math');
if (triggerMath) {
switcher.trigger = _toMathExpr(triggerMath);
}