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); }