10 #include <sbml/Model.h>
18 mAssumeDimensionlessOne(false),
20 mpSBMLAmountUnit(NULL),
21 mpSBMLVolumeUnit(NULL),
23 mpSBMLLengthUnit(NULL),
24 mpSBMLConflictUnit(NULL)
53 tmpUnitTime.setKind(UNIT_KIND_SECOND);
54 tmpTime.addUnit(&tmpUnitTime);
59 tmpUnitAmount.setKind(UNIT_KIND_MOLE);
60 tmpAmount.addUnit(&tmpUnitAmount);
65 tmpUnitVol.setKind(UNIT_KIND_LITRE);
66 tmpVol.addUnit(&tmpUnitVol);
71 tmpUnitAr.setKind(UNIT_KIND_METRE);
72 tmpUnitAr.setExponent(2);
73 tmpAr.addUnit(&tmpUnitAr);
78 tmpUnitL.setKind(UNIT_KIND_METRE);
79 tmpL.addUnit(&tmpUnitL);
92 if (this->
mpModel->getUnitDefinition(
"time"))
95 if (this->
mpModel->getUnitDefinition(
"substance"))
98 if (this->
mpModel->getUnitDefinition(
"volume"))
101 if (this->
mpModel->getUnitDefinition(
"area"))
104 if (this->
mpModel->getUnitDefinition(
"length"))
113 for (i = 0; i < this->
mpModel->getNumSpecies(); i++)
115 Species * s = this->
mpModel->getSpecies(i);
117 if (unitsFromModel && s->isSetUnits())
119 std::map<std::string, CSBMLunitInformation>::iterator pos = this->
mSBMLObjectsMap.find(s->getId());
132 if (s->getHasOnlySubstanceUnits())
134 std::map<std::string, CSBMLunitInformation>::iterator pos = this->
mSBMLObjectsMap.find(s->getId());
138 pos->second = (*mpSBMLAmountUnit);
142 mSBMLObjectsMap.insert(std::pair<std::string, CSBMLunitInformation>(s->getId(), (*mpSBMLAmountUnit)));
148 Compartment* comp = this->
mpModel->getCompartment(s->getCompartment());
152 std::map<std::string, CSBMLunitInformation>::iterator pos = this->
mSBMLObjectsMap.find(s->getId());
156 pos->second = (*mpSBMLConflictUnit);
160 mSBMLObjectsMap.insert(std::pair<std::string, CSBMLunitInformation>(s->getId(), (*mpSBMLConflictUnit)));
166 switch (comp->getSpatialDimensions())
171 tmp = (*mpSBMLLengthUnit);
174 tmp = (*mpSBMLAreaUnit);
177 tmp = (*mpSBMLVolumeUnit);
187 std::map<std::string, CSBMLunitInformation>::iterator pos = this->
mSBMLObjectsMap.find(s->getId());
204 for (i = 0; i < this->
mpModel->getNumCompartments(); i++)
206 Compartment *c = this->
mpModel->getCompartment(i);
208 if (unitsFromModel && c->isSetUnits())
211 std::map<std::string, CSBMLunitInformation>::iterator pos = this->
mSBMLObjectsMap.find(c->getId());
226 switch (c->getSpatialDimensions())
231 tmp = (*mpSBMLLengthUnit);
234 tmp = (*mpSBMLAreaUnit);
237 tmp = (*mpSBMLVolumeUnit);
243 std::map<std::string, CSBMLunitInformation>::iterator pos = this->
mSBMLObjectsMap.find(c->getId());
251 mSBMLObjectsMap.insert(std::pair<std::string, CSBMLunitInformation>(c->getId(), tmp));
257 for (i = 0; i < this->
mpModel->getNumParameters(); i++)
259 Parameter *p = this->
mpModel->getParameter(i);
261 if (unitsFromModel && p->isSetUnits())
263 std::map<std::string, CSBMLunitInformation>::iterator pos = this->
mSBMLObjectsMap.find(p->getId());
276 std::map<std::string, CSBMLunitInformation>::iterator pos = this->
mSBMLObjectsMap.find(p->getId());
293 for (j = 0; j < this->
mpModel->getNumReactions(); j++)
295 Reaction * reaction = this->
mpModel->getReaction(j);
296 std::map<std::string, CSBMLunitInformation> tmpMap;
298 if (reaction->getKineticLaw() != NULL)
300 for (i = 0; i < reaction->getKineticLaw()->getNumParameters(); i++)
302 Parameter *p = reaction->getKineticLaw()->getParameter(i);
304 if (unitsFromModel && p->isSetUnits())
307 UnitDefinition* tmpUD = this->
mpModel->getUnitDefinition(p->getUnits());
311 std::map<std::string, CSBMLunitInformation>::iterator pos = tmpMap.find(p->getId());
313 if (pos != tmpMap.end())
325 if (p->getUnits() ==
"dimensionless")
327 std::map<std::string, CSBMLunitInformation>::iterator pos = tmpMap.find(p->getId());
329 if (pos != tmpMap.end())
340 std::map<std::string, CSBMLunitInformation>::iterator pos = tmpMap.find(p->getId());
342 if (pos != tmpMap.end())
358 std::map<std::string, CSBMLunitInformation>::iterator pos = tmpMap.find(p->getId());
360 if (pos != tmpMap.end())
386 amountPerTimeUnit.
invert();
392 for (i = 0; i < this->
mpModel->getNumReactions(); i++)
394 Reaction * reaction = this->
mpModel->getReaction(i);
396 if (!reaction->getKineticLaw())
continue;
398 if (!reaction->getKineticLaw()->isSetMath())
continue;
403 tmp.
mpExpression = reaction->getKineticLaw()->getMath();
412 for (i = 0; i < this->
mpModel->getNumRules(); i++)
414 Rule* rule = this->
mpModel->getRule(i);
416 if (!rule->isSetMath())
continue;
428 else if (rule->isAssignment())
435 else if (rule->isAlgebraic())
446 for (i = 0; i < this->
mpModel->getNumEvents(); i++)
448 Event*
event = this->
mpModel->getEvent(i);
451 if (event->isSetTrigger() &&
event->getTrigger()->isSetMath())
461 if (event->isSetDelay() &&
event->getDelay()->isSetMath())
472 for (j = 0; j <
event->getNumEventAssignments(); ++j)
474 EventAssignment* ea =
event->getEventAssignment(j);
514 for (i = 0; i <
mpModel->getNumParameters(); i++)
516 Parameter *p =
mpModel->getParameter(i);
525 for (j = 0; j <
mpModel->getNumUnitDefinitions(); ++j)
529 if (j < mpModel->getNumUnitDefinitions())
530 p->setUnits(
mpModel->getUnitDefinition(j)->getId());
534 std::string tmpstring;
539 std::ostringstream tmpid; tmpid <<
"unit_" << id;
540 tmpstring = tmpid.str();
543 while (
mpModel->getUnitDefinition(tmpstring));
552 p->setUnits(tmpstring);
560 for (j = 0; j <
mpModel->getNumReactions(); j++)
562 Reaction * reaction =
mpModel->getReaction(j);
564 if (reaction->getKineticLaw() != NULL)
565 for (i = 0; i < reaction->getKineticLaw()->getNumParameters(); i++)
567 Parameter *p = reaction->getKineticLaw()->getParameter(i);
578 for (j = 0; j <
mpModel->getNumUnitDefinitions(); ++j)
582 if (j < mpModel->getNumUnitDefinitions())
583 p->setUnits(
mpModel->getUnitDefinition(j)->getId());
587 std::string tmpstring;
592 std::ostringstream tmpid; tmpid <<
"unit_" << id;
593 tmpstring = tmpid.str();
596 while (
mpModel->getUnitDefinition(tmpstring));
605 p->setUnits(tmpstring);
620 const unsigned int CONFLICT = 5;
627 std::map<std::string, CSBMLunitInformation>::const_iterator it, itEnd =
mSBMLObjectsMap.end();
631 if (it->second.isConflict())
638 std::map<std::string, std::map<std::string, CSBMLunitInformation> >::const_iterator rit;
642 for (it = rit->second.begin(); it != rit->second.end(); ++it)
644 if (it->second.isConflict())
652 std::map<const ASTNode*, CSBMLunitInformation>::const_iterator nit, nitEnd =
mSBMLNumbersMap.end();
656 if (nit->second.isConflict())
670 if (stat.
all.size() != 6)
return;
672 std::cout <<
"Global: " <<
" ? " << stat.
global[0]
673 <<
" default " << stat.
global[1]
674 <<
" glob " << stat.
global[2]
675 <<
" pro " << stat.
global[3]
676 <<
" deriv " << stat.
global[4]
677 << (stat.
global[5] > 0 ?
" conflict " :
" ") << stat.
global[5] << std::endl;
678 std::cout <<
"Local: " <<
" ? " << stat.
local[0]
679 <<
" default " << stat.
local[1]
680 <<
" glob " << stat.
local[2]
681 <<
" pro " << stat.
local[3]
682 <<
" deriv " << stat.
local[4]
683 << (stat.
local[5] > 0 ?
" conflict " :
" ") << stat.
local[5] << std::endl;
684 std::cout <<
"Numbers:" <<
" ? " << stat.
numbers[0]
685 <<
" default " << stat.
numbers[1]
688 <<
" deriv " << stat.
numbers[4]
689 << (stat.
numbers[5] > 0 ?
" conflict " :
" ") << stat.
numbers[5] << std::endl;
691 if (flag) std::cout <<
"_";
693 std::cout <<
"Sum :" <<
" ? " << stat.
all[0]
694 <<
" default " << stat.
all[1]
695 <<
" glob " << stat.
all[2]
696 <<
" pro " << stat.
all[3]
697 <<
" deriv " << stat.
all[4]
698 << (stat.
all[5] > 0 ?
" CONFLICT_SUM " :
" ") << stat.
all[5] << std::endl;
700 if (stat.
all[0] == 0)
701 std::cout <<
"***SUCCESS***" << std::endl;
703 std::cout <<
"only some numbers are still unknown" << std::endl;
705 std::cout <<
"some unknown units left..." << std::endl;
713 std::vector<std::string> ret;
715 std::map<std::string, CSBMLunitInformation>::const_iterator it, itEnd =
mSBMLObjectsMap.end();
719 if (status == 5 && it->second.isConflict())
720 ret.push_back(it->first);
722 if (status < 5 && (
int)it->second.getInfo() == status)
723 ret.push_back(it->first);
731 std::vector<std::pair<std::string, std::string> > ret;
733 std::map<std::string, CSBMLunitInformation>::const_iterator it;
734 std::map<std::string, std::map<std::string, CSBMLunitInformation> >::const_iterator rit;
738 for (it = rit->second.begin(); it != rit->second.end(); ++it)
740 if (status == 5 && it->second.isConflict())
741 ret.push_back(std::pair<std::string, std::string>(rit->first, it->first));
743 if (status < 5 && (
int)it->second.getInfo() == status)
744 ret.push_back(std::pair<std::string, std::string>(rit->first, it->first));
755 ret +=
"Some objects in the SBML file have unknown units. \n";
756 ret +=
"Global objects:\n";
761 for (i = 0; i < globalobjects.size(); ++i)
763 const Compartment* c =
mpModel->getCompartment(globalobjects[i]);
766 ret +=
" Compartment " + c->getId() +
" " + c->getName() +
"\n";
768 const Species* s =
mpModel->getSpecies(globalobjects[i]);
771 ret +=
" Species " + s->getId() +
" " + s->getName() +
"\n";
773 const Parameter* p =
mpModel->getParameter(globalobjects[i]);
776 ret +=
" Global parameter " + p->getId() +
" " + p->getName() +
"\n";
780 ret +=
"Local parameters:\n";
782 std::vector<std::pair<std::string, std::string> > localparameters =
785 for (i = 0; i < localparameters.size(); ++i)
787 const Reaction* r =
mpModel->getReaction(localparameters[i].first);
791 ret +=
" Reaction " + r->getId() +
" " + r->getName()
792 +
", parameter " + localparameters[i].second +
"\n";
802 std::cout <<
"global units:" << std::endl;
809 std::cout << std::endl;
811 std::map<std::string, CSBMLunitInformation>::const_iterator it, itEnd =
mSBMLObjectsMap.end();
815 std::cout << it->first <<
" " << it->second.getDisplayString() << std::endl;
818 std::cout << std::endl;
820 std::map<std::string, std::map<std::string, CSBMLunitInformation> >::const_iterator rit;
824 for (it = rit->second.begin(); it != rit->second.end(); ++it)
826 std::cout << rit-> first <<
" "
827 << it->first <<
" " << it->second.getDisplayString() << std::endl;
831 std::cout << std::endl;
832 std::cout <<
"Expressions: \n\n";
838 std::cout << std::string(SBML_formulaToString(tmp.
mpExpression)) <<
" :: "
839 << (tmp.
mPerTime ?
"per time" :
"") <<
" "
850 std::cout << std::endl;
867 std::vector<CExpressionInformation>::iterator it, itEnd =
mSBMLExpressions.end();
870 for (count = 0; count < 3; ++count)
878 std::cout << std::string(SBML_formulaToString(tmp.
mpExpression)) <<
" :: "
879 << (tmp.
mPerTime ?
"per time" :
"") <<
" "
888 std::cout << std::endl;
915 if (!pNodeUnit)
return;
954 if (!node)
return ret;
957 if (node->getType() == AST_FUNCTION_DELAY)
959 if (node->getNumChildren() != 2)
963 recursion(node->getChild(1), tmpTimeUnit, ei);
964 return recursion(node->getChild(0), ui, ei);
971 if (node->getType() == AST_NAME_TIME)
1004 std::map<const ASTNode*, CSBMLunitInformation>::iterator pos =
mSBMLNumbersMap.find(node);
1008 pNodeUnit = &pos->second;
1013 std::pair<const ASTNode*, CSBMLunitInformation>
1039 switch (node->getType())
1043 case AST_RELATIONAL_EQ:
1044 case AST_RELATIONAL_GEQ:
1045 case AST_RELATIONAL_GT:
1046 case AST_RELATIONAL_LEQ:
1047 case AST_RELATIONAL_LT:
1048 case AST_RELATIONAL_NEQ:
1061 case AST_FUNCTION_POWER:
1079 unsigned int i, numArgs = fd->getNumArguments();
1080 assert(numArgs == node->getNumChildren());
1083 std::map<std::string, ASTNode*> tmpMap;
1085 for (i = 0; i < numArgs; ++i)
1086 tmpMap[fd->getArgument(i)->getName()] = node->getChild(i);
1090 return recursion(fd->getBody(), ui, tmpEI);
1097 switch (node->getType())
1099 case AST_FUNCTION_ARCCOS:
1100 case AST_FUNCTION_ARCCOSH:
1101 case AST_FUNCTION_ARCCOT:
1102 case AST_FUNCTION_ARCCOTH:
1103 case AST_FUNCTION_ARCCSC:
1104 case AST_FUNCTION_ARCCSCH:
1105 case AST_FUNCTION_ARCSEC:
1106 case AST_FUNCTION_ARCSECH:
1107 case AST_FUNCTION_ARCSIN:
1108 case AST_FUNCTION_ARCSINH:
1109 case AST_FUNCTION_ARCTAN:
1110 case AST_FUNCTION_ARCTANH:
1112 case AST_FUNCTION_COS:
1113 case AST_FUNCTION_COSH:
1114 case AST_FUNCTION_COT:
1115 case AST_FUNCTION_COTH:
1116 case AST_FUNCTION_CSC:
1117 case AST_FUNCTION_CSCH:
1118 case AST_FUNCTION_SEC:
1119 case AST_FUNCTION_SECH:
1120 case AST_FUNCTION_SIN:
1121 case AST_FUNCTION_SINH:
1122 case AST_FUNCTION_TAN:
1123 case AST_FUNCTION_TANH:
1125 case AST_FUNCTION_EXP:
1126 case AST_FUNCTION_FACTORIAL:
1127 case AST_FUNCTION_LN:
1128 case AST_FUNCTION_LOG:
1133 case AST_FUNCTION_CEILING:
1134 case AST_FUNCTION_FLOOR:
1135 case AST_FUNCTION_ABS:
1136 return recursion(node->getChild(0), ui, ei);
1144 switch (node->getType())
1146 case AST_CONSTANT_E:
1147 case AST_CONSTANT_PI:
1151 case AST_FUNCTION_PIECEWISE:
1162 unsigned int i, numChildren = node->getNumChildren();
1164 for (i = 0; i < numChildren; ++i)
1217 if (!node)
return ret;
1223 unsigned int i, numChildren = node->getNumChildren();
1224 std::vector<CSBMLunitInformation> childUnits;
1231 for (i = 0; i < numChildren; ++i)
1232 childUnits[i] =
recursion(node->getChild(i), ui, ei);
1237 for (i = 0; i < numChildren; ++i)
1239 childUnits[i] =
recursion(node->getChild(i), ui, ei);
1245 if (i >= numChildren)
1250 unsigned int tmp = i;
1251 ret = childUnits[tmp];
1253 for (i = 0; i < numChildren; ++i)
1255 if (i == tmp)
continue;
1257 childUnits[i] =
recursion(node->getChild(i), ret, ei);
1272 if (!node)
return ret;
1278 unsigned int i, numChildren = node->getNumChildren();
1279 std::vector<CSBMLunitInformation> childUnits;
1283 std::vector<int> unknown;
1286 for (i = 0; i < numChildren; ++i)
1288 childUnits[i] =
recursion(node->getChild(i), uu, ei);
1291 unknown.push_back(i);
1298 if (unknown.size() > 0)
1302 ret = childUnits[0];
1303 bool success =
true;
1305 for (i = 1; i < numChildren; ++i)
1306 success &= ret.
multiply(childUnits[i]);
1316 if (unknown.size() > 1)
1320 unsigned int tmp = unknown.size() ? unknown[0] : 0;
1324 bool success =
true;
1326 for (i = 0; i < numChildren; ++i)
1328 success &= tmpUnit.
multiply(childUnits[i]);
1339 childUnits[tmp] =
recursion(node->getChild(tmp), tmpUnit, ei);
1352 if (!node)
return ret;
1358 unsigned int i, numChildren = node->getNumChildren();
1359 assert(numChildren == 2);
1360 std::vector<CSBMLunitInformation> childUnits;
1364 std::vector<int> unknown;
1367 for (i = 0; i < numChildren; ++i)
1369 childUnits[i] =
recursion(node->getChild(i), uu, ei);
1372 unknown.push_back(i);
1379 if (unknown.size() > 0)
1383 ret = childUnits[1];
1384 bool success =
true;
1386 success &= ret.
multiply(childUnits[0]);
1396 if (unknown.size() > 1)
1400 if (unknown.size() == 0 || unknown[0] == 0)
1404 bool success =
true;
1413 childUnits[0] =
recursion(node->getChild(0), tmpUnit, ei);
1420 bool success =
true;
1422 success &= tmpUnit.
multiply(childUnits[0]);
1431 childUnits[1] =
recursion(node->getChild(1), tmpUnit, ei);
1444 if (!node)
return ret;
1448 unsigned int numChildren = node->getNumChildren();
1449 assert(numChildren == 2);
1450 std::vector<CSBMLunitInformation> childUnits;
1462 if (fabs(res.result - floor(res.result + 0.5)) < 1e-100)
1464 int intExp = (int) floor(res.result + 0.5);
1469 ret = childUnits[0];
1473 ret.applyExponent(intExp);
1482 childUnits[0] =
recursion(node->getChild(0), tmpUI, ei);
1498 if (node->getChild(1)->isName())
1503 ret = childUnits[0];
1507 ret.applyExponent(node->getChild(1)->getName(), ei.
mFrameStack.size());
1516 childUnits[0] =
recursion(node->getChild(0), tmpUI, ei);
1557 if (!node)
return ret;
1563 unsigned int i, numChildren = node->getNumChildren();
1564 std::vector<CSBMLunitInformation> childUnits;
1568 for (i = 1; i < numChildren; i += 2)
1575 for (i = 0; i < numChildren; i += 2)
1576 childUnits[i] =
recursion(node->getChild(i), ui, ei);
1581 for (i = 0; i < numChildren; i += 2)
1583 childUnits[i] =
recursion(node->getChild(i), ui, ei);
1589 if (i >= numChildren)
1594 unsigned int tmp = i;
1595 ret = childUnits[tmp];
1597 for (i = 0; i < numChildren; i += 2)
1599 if (i == tmp)
continue;
1601 childUnits[i] =
recursion(node->getChild(i), ret, ei);
1618 std::map<std::string, std::map<std::string, CSBMLunitInformation> >::iterator rit;
1623 std::map<std::string, CSBMLunitInformation>::iterator it;
1624 it = rit->second.find(node);
1626 if (it != rit->second.end())
1636 std::map<std::string, CSBMLunitInformation>::iterator it;
1651 std::map<std::string, ASTNode*>::const_iterator it;
1664 return mpModel->getFunctionDefinition(node);
1670 std::map<const ASTNode*, CSBMLunitInformation>::iterator it =
mSBMLNumbersMap.find(node);
1682 return (node && node->isName());
1689 (node->isOperator() || node->isRelational() || node->getType() == AST_FUNCTION_POWER));
1694 return (node && (node->isNumber() || node->isRational()));
1699 return (node && (node->getType() == AST_FUNCTION));
1704 return (node && (node->getType() > AST_FUNCTION) && (node->getType() <= AST_FUNCTION_TANH));
1710 return std::numeric_limits< double >::quiet_NaN();
1712 switch (node->getType())
1715 return node->getInteger();
1721 return node->getReal();
1726 return std::numeric_limits< double >::quiet_NaN();
1733 return node->getName();
static std::string getIdentifier(const ASTNode *node)
EvaluationResult evaluate(const ASTNode *node)
std::vector< unsigned int > local
void handleOneExpression(CExpressionInformation &ei)
try to find out as much as possible about the units from one expression
CSBMLunitInformation * mpSBMLAreaUnit
CSBMLunitInformation * mpSBMLConflictUnit
CSBMLunitInformation recursionPiecewise(const ASTNode *node, const CSBMLunitInformation &ui, const CEnvironmentInformation &ei)
std::vector< CExpressionInformation > mSBMLExpressions
CSBMLunitInformation recursionTimes(const ASTNode *node, const CSBMLunitInformation &ui, const CEnvironmentInformation &ei)
Model * mpModel
the sbml model from which this interface was initialized
void applyExponent(double exp)
apply numeric exponent to the unit.
std::vector< unsigned int > global
bool mAssumeDimensionlessOne
FunctionDefinition * resolveFunctionName(const std::string &node)
static bool isNumber(const ASTNode *node)
determines if the node represents a number (integer, real, or rational)
unsigned int mSBMLVersion
CSBMLunitInterface(const CSBMLunitInterface &src)
CSBMLunitInformation * mpSBMLLengthUnit
CSBMLunitInformation recursion(const ASTNode *node, const CSBMLunitInformation &ui, const CEnvironmentInformation &ei)
static bool isEqual(const CSBMLunit &unit1, const CSBMLunit &unit2)
CSBMLunitInformation * getMappedUnitFromIdentifier(const std::string &node, const CEnvironmentInformation &ei)
void applyInverseExponent(const std::string &id, size_t frame)
apply inverse of symbolic exponent to the unit
std::map< std::string, CSBMLunitInformation > mSBMLObjectsMap
void calculateStatistics()
std::vector< std::string > getListOfObjectsWithGivenUnitStatus(int status) const
CSBMLunitInformation handleTerminalNode(const CSBMLunitInformation &ui, CSBMLunitInformation *pNodeUnit, const ASTNode *node)
int getSymbolicExpExp() const
ASTNode * resolveVariableName(const std::string &node, const CEnvironmentInformation &ei)
CSBMLunitInformation * getMappedUnitFromNumberNode(const ASTNode *node)
CSBMLunitInformation * mpSBMLAmountUnit
void initializeDefaultUnits()
initializes the base units with the defaults (moles, seconds, l, m, m^2)
static bool isOperator(const ASTNode *node)
void initializeFromSBMLModel(bool unitsFromModel)
CSBMLunitInformation * mpSBMLVolumeUnit
UnitDefinition & getSBMLUnitDefinition()
std::vector< unsigned int > numbers
std::map< std::string, std::map< std::string, CSBMLunitInformation > > mSBMLLocalParametersMap
static void outputStatistics(const Statistics &stat, bool flag)
static bool isObject(const ASTNode *node)
static bool isFunctionCall(const ASTNode *node)
determines if the node contains a call to a function definition
std::map< const ASTNode *, CSBMLunitInformation > mSBMLNumbersMap
std::vector< unsigned int > all
static double getValueFromNumberNode(const ASTNode *node)
return the value of a number node
static bool isBuiltInFunctionCall(const ASTNode *node)
determines if the node contains a call to a built in function
bool multiply(const CSBMLunit &unit)
CSBMLunitInformation recursionDivide(const ASTNode *node, const CSBMLunitInformation &ui, const CEnvironmentInformation &ei)
std::set< const ASTNode * > mConflictingNodes
contains the (terminal) nodes where a conflict appeared
CSBMLunitInformation * mpSBMLTimeUnit
CSBMLunitInformation recursionPower(const ASTNode *node, const CSBMLunitInformation &ui, const CEnvironmentInformation &ei)
const std::set< const ASTNode * > & getListOfConflictingNodes() const
std::string getMessageAboutUnknownUnits() const
std::vector< std::pair< std::string, std::string > > getListOfLocalParametersWithGivenUnitStatus(int status) const
CSBMLunitInformation recursionEqual(const ASTNode *node, const CSBMLunitInformation &ui, const CEnvironmentInformation &ei)