15 #include <sbml/Model.h>
20 : mRootNode(rootnode), mpModel(NULL), mpReaction(NULL),
21 mUseReactionNameInLocalParameters(true)
30 #define SPC(level) std::string(level, ' ')
34 int type = (int)node->getType();
37 if (type == AST_FUNCTION_PIECEWISE)
40 out <<
SPC(l) <<
"<mrow>" << std::endl;
41 out <<
SPC(l + 1) <<
"<mo> {</mo>" << std::endl;
42 out <<
SPC(l + 1) <<
"<mtable>" << std::endl;
44 for (i = 0; i < node->getNumChildren() / 2 + 1; ++i)
46 out <<
SPC(l + 2) <<
"<mtr>" << std::endl;
47 out <<
SPC(l + 3) <<
"<mtd>" << std::endl;
48 writeMathML(out, node->getChild((
unsigned int)(0 + i * 2)), l + 3);
49 out <<
SPC(l + 3) <<
"<mo> , </mo>" << std::endl;
50 out <<
SPC(l + 3) <<
"</mtd>" << std::endl;
52 out <<
SPC(l + 3) <<
"<mtd>" << std::endl;
54 if (1 + i * 2 >= node->getNumChildren())
55 out <<
SPC(l + 3) <<
"<mo> else </mo>" << std::endl;
57 writeMathML(out, node->getChild((
unsigned int)(1 + i * 2)), l + 3);
59 out <<
SPC(l + 3) <<
"</mtd>" << std::endl;
60 out <<
SPC(l + 2) <<
"</mtr>" << std::endl;
63 out <<
SPC(l + 1) <<
"</mtable>" << std::endl;
64 out <<
SPC(l) <<
"</mrow>" << std::endl;
69 if (type == AST_FUNCTION_POWER)
73 if (type >= AST_FUNCTION && type <= AST_FUNCTION_TANH)
96 out <<
SPC(l) <<
"<mrow>" << std::endl;
98 for (i = 0; i < node->getNumChildren(); ++i)
101 out <<
SPC(l + 1) <<
"<mo>" <<
"+" <<
"</mo>" << std::endl;
103 writeMathML(out, node->getChild((
unsigned int) i), l + 1);
106 out <<
SPC(l) <<
"</mrow>" << std::endl;
111 if (node->getNumChildren() <= 0 || node->getNumChildren() > 2)
114 out <<
SPC(l) <<
"<mrow>" << std::endl;
116 if (node->getNumChildren() == 2)
119 out <<
SPC(l + 1) <<
"<mo>" <<
"-" <<
"</mo>" << std::endl;
121 tmp = node->getNumChildren() - 1;
122 flag = (node->getChild((
unsigned int) tmp)->getType() == AST_PLUS)
123 || (node->getChild((
unsigned int) tmp)->getType() == AST_MINUS);
126 if (flag) out <<
SPC(l + 1) <<
"<mfenced>" << std::endl;
128 writeMathML(out, node->getChild((
unsigned int) tmp), l + 2);
130 if (flag) out <<
SPC(l + 1) <<
"</mfenced>" << std::endl;
132 out <<
SPC(l) <<
"</mrow>" << std::endl;
136 out <<
SPC(l) <<
"<mrow>" << std::endl;
138 for (i = 0; i < node->getNumChildren(); ++i)
141 out <<
SPC(l + 1) <<
"<mo>" <<
"·" <<
"</mo>" << std::endl;
144 flag = (node->getChild((
unsigned int) i)->getType() == AST_PLUS)
145 || (node->getChild((
unsigned int) i)->getType() == AST_MINUS);
148 if (flag) out <<
SPC(l + 1) <<
"<mfenced>" << std::endl;
150 writeMathML(out, node->getChild((
unsigned int) i), l + 1);
152 if (flag) out <<
SPC(l + 1) <<
"</mfenced>" << std::endl;
155 out <<
SPC(l) <<
"</mrow>" << std::endl;
159 out <<
SPC(l) <<
"<mfrac>" << std::endl;
169 out <<
SPC(l) <<
"</mfrac>" << std::endl;
173 out <<
SPC(l) <<
"<msup>" << std::endl;
176 flag = ((node->getChild(0)->getType() == AST_PLUS)
177 || (node->getChild(0)->getType() == AST_MINUS)
178 || (node->getChild(0)->getType() == AST_TIMES)
179 || (node->getChild(0)->getType() == AST_DIVIDE)
180 || (node->getChild(0)->getType() == AST_POWER));
183 if (flag) out <<
SPC(l + 1) <<
"<mfenced>" << std::endl;
187 if (flag) out <<
SPC(l + 1) <<
"</mfenced>" << std::endl;
189 out <<
SPC(l + 1) <<
"<mrow>" << std::endl;
191 out <<
SPC(l + 1) <<
"</mrow>" << std::endl;
193 out <<
SPC(l) <<
"</msup>" << std::endl;
197 out <<
"<mi>ⅇ</mi>" << std::endl;
200 case AST_CONSTANT_PI:
201 out <<
SPC(l) <<
"<mi>π</mi>" << std::endl;
204 case AST_CONSTANT_FALSE:
205 out <<
SPC(l) <<
"<mi>false</mi>" << std::endl;
208 case AST_CONSTANT_TRUE:
209 out <<
SPC(l) <<
"<mi>true</mi>" << std::endl;
213 out <<
SPC(l) <<
"<mi>t</mi>" << std::endl;
216 case AST_LOGICAL_AND:
218 case AST_LOGICAL_XOR:
219 case AST_RELATIONAL_EQ:
220 case AST_RELATIONAL_GEQ:
221 case AST_RELATIONAL_GT:
222 case AST_RELATIONAL_LEQ:
223 case AST_RELATIONAL_LT:
224 case AST_RELATIONAL_NEQ:
230 case AST_LOGICAL_AND: op =
"⩓"; flag =
true;
break;
232 case AST_LOGICAL_OR: op =
"⩔"; flag =
true;
break;
234 case AST_LOGICAL_XOR: op =
"xor"; flag =
true;
break;
236 case AST_RELATIONAL_EQ: op =
"="; flag =
false;
break;
238 case AST_RELATIONAL_GEQ: op =
"≥"; flag =
false;
break;
240 case AST_RELATIONAL_GT: op =
">"; flag =
false;
break;
242 case AST_RELATIONAL_LEQ: op =
"≤"; flag =
false;
break;
244 case AST_RELATIONAL_LT: op =
"<"; flag =
false;
break;
246 case AST_RELATIONAL_NEQ: op =
"≠"; flag =
false;
break;
248 default: op =
"???"; flag =
true;
break;
251 out <<
SPC(l) <<
"<mrow>" << std::endl;
253 for (i = 0; i < node->getNumChildren(); ++i)
256 out <<
SPC(l + 1) <<
"<mo>" << op <<
"</mo>" << std::endl;
260 if (flag) out <<
SPC(l + 1) <<
"<mfenced>" << std::endl;
262 writeMathML(out, node->getChild((
unsigned int) i), l + 1);
264 if (flag) out <<
SPC(l + 1) <<
"</mfenced>" << std::endl;
267 out <<
SPC(l) <<
"</mrow>" << std::endl;
271 case AST_LOGICAL_NOT:
272 out <<
SPC(l) <<
"<mover>" << std::endl;
274 out <<
SPC(l) <<
"<mo>‾</mo></mover>" << std::endl;
278 out <<
SPC(l) <<
"<mi>" <<
"xxx" <<
"</mi>" << std::endl;
285 out <<
SPC(l) <<
"<mrow>" << std::endl;
288 out <<
SPC(l + 1) <<
"<mo> ⁡ </mo>" << std::endl;
289 out <<
SPC(l + 1) <<
"<mrow>" << std::endl;
290 out <<
SPC(l + 2) <<
"<mo> (</mo>" << std::endl;
291 out <<
SPC(l + 2) <<
"<mrow>" << std::endl;
295 for (i = 0; i < node->getNumChildren(); ++i)
298 out <<
SPC(l + 3) <<
"<mo> , </mo>" << std::endl;
300 writeMathML(out, node->getChild((
unsigned int) i), l + 3);
303 out <<
SPC(l + 2) <<
"</mrow>" << std::endl;
304 out <<
SPC(l + 2) <<
"<mo>) </mo>" << std::endl;
306 out <<
SPC(l + 1) <<
"</mrow>" << std::endl;
307 out <<
SPC(l) <<
"</mrow>" << std::endl;
321 const Parameter* p =
mpReaction->getKineticLaw()->getParameter(node->getName());
325 std::string ident = p->getName() ==
"" ? p->getId() : p->getName();
330 out <<
SPC(l) <<
"<msub><mi>" << ident <<
"</mi><mi>" << r_ident <<
"</mi></msub>" << std::endl;
335 const Compartment* c =
mpModel->getCompartment(node->getName());
339 std::string ident = c->getName() ==
"" ? c->getId() : c->getName();
342 switch (c->getSpatialDimensions())
344 case 1: ccc =
"l";
break;
346 case 2: ccc =
"A";
break;
348 case 3: ccc =
"V";
break;
350 default: ccc =
"ERROR";
353 out <<
SPC(l) <<
"<msub><mi>" << ccc <<
"</mi><mi>" << ident <<
"</mi></msub>" << std::endl;
357 const Species* s =
mpModel->getSpecies(node->getName());
361 std::string ident = s->getName() ==
"" ? s->getId() : s->getName();
363 if (!s->getHasOnlySubstanceUnits())
364 out <<
SPC(l) <<
"<mi>[" << ident <<
"]</mi>" << std::endl;
367 out <<
SPC(l) <<
"<mrow><msup><mphantom><mi>.</mi></mphantom><mi mathcolor=\"gray\">S</mi></msup><mi>" << ident <<
"</mi></mrow>" << std::endl;
373 const Parameter* p =
mpModel->getParameter(node->getName());
377 std::string ident = p->getName() ==
"" ? p->getId() : p->getName();
379 out <<
SPC(l) <<
"<mrow><msup><mphantom><mi>.</mi></mphantom><mi mathcolor=\"gray\">P</mi></msup><mi>" << ident <<
"</mi></mrow>" << std::endl;
389 if (node->isInteger())
390 out <<
SPC(l) <<
"<mn>" << node->getInteger() <<
"</mn>" << std::endl;
391 else if (node->isReal())
392 out <<
SPC(l) <<
"<mn>" << node->getReal() <<
"</mn>" << std::endl;
virtual void writeMathMLNumber(std::ostream &out, const ASTNode *node, size_t l) const
void writeMathML(std::ostream &out) const
static std::string fixName(const std::string &name)
const Reaction * mpReaction
const ASTNode * mRootNode
bool mUseReactionNameInLocalParameters
virtual void writeMathMLFunction(std::ostream &out, const ASTNode *node, size_t l) const
Expression2PresentationMML(const ASTNode *rootnode)
virtual void writeMathMLName(std::ostream &out, const ASTNode *node, size_t l) const