void checkSpeciesRefs(Model* model, ListOfSpeciesReferences* losr, set<string>& components, set<string>& tests, const map<string, vector<double> >& results) { for (unsigned int rp=0; rp<losr->size(); rp++) { SpeciesReference* sr = static_cast<SpeciesReference*>(losr->get(rp)); if (sr->isSetStoichiometry() && sr->getStoichiometry() != 1) { tests.insert("NonUnityStoichiometry"); } if (sr->isSetStoichiometryMath()) { tests.insert("NonUnityStoichiometry"); components.insert("StoichiometryMath"); if (variesIn(sr->getStoichiometryMath()->getMath(), model, results)) { tests.insert("AssignedVariableStoichiometry"); } else { tests.insert("AssignedConstantStoichiometry"); } } else if (sr->isSetId()) { double initialResult = 1; if (results.find(sr->getId()) != results.end()) { tests.insert("SpeciesReferenceOutput"); } if (variesIn(sr->getId(), model, results)) { tests.insert("AssignedVariableStoichiometry"); tests.insert("NonUnityStoichiometry"); } else if (initialOverriddenIn(sr->getId(), model, results, tests)) { tests.insert("AssignedConstantStoichiometry"); if (getInitialResultFor(sr->getId(), results, initialResult)) { if (initialResult != 1) { tests.insert("NonUnityStoichiometry"); } } else { //Don't know what the actual initial result is, so we'll assume it's not 1.0. tests.insert("NonUnityStoichiometry"); } } if (initialOverriddenIn(sr->getId(), model, results, tests)) { tests.insert("InitialValueReassigned"); } if (foundInMath(sr->getId(), model)) { tests.insert("SpeciesReferenceInMath"); } } } }
void dealWithAssigningL1Stoichiometry(Model & m, bool l2) { //char newid[15]; std::string id; for (unsigned int i = 0; i < m.getNumReactions(); i++) { Reaction *r = m.getReaction(i); unsigned int j; for (j = 0; j < r->getNumReactants(); j++) { SpeciesReference *sr = r->getReactant(j); // we do not get here unless the stoichiometryMath is an integer // or a rational if (l2 == true && sr->isSetStoichiometryMath() == true) { const ASTNode* ast = sr->getStoichiometryMath()->getMath(); if (ast->isInteger()) { int num = ast->getInteger(); sr->setStoichiometry(num); sr->setDenominator(1); } else { int num = ast->getNumerator(); int denom = ast->getDenominator(); sr->setStoichiometry(num); sr->setDenominator(denom); } sr->unsetStoichiometryMath(); } else { sr->setStoichiometry(sr->getStoichiometry()); sr->setDenominator(1); } } for (j = 0; j < r->getNumProducts(); j++) { SpeciesReference *sr = r->getProduct(j); // we do not get here unless the stoichiometryMath is an integer // or a rational if (l2 == true && sr->isSetStoichiometryMath() == true) { const ASTNode* ast = sr->getStoichiometryMath()->getMath(); if (ast->isInteger()) { int num = ast->getInteger(); sr->setStoichiometry(num); sr->setDenominator(1); } else { int num = ast->getNumerator(); int denom = ast->getDenominator(); sr->setStoichiometry(num); sr->setDenominator(denom); } sr->unsetStoichiometryMath(); } else { sr->setStoichiometry(sr->getStoichiometry()); sr->setDenominator(1); } } } }
void dealWithL1Stoichiometry(Model & m, bool l2) { unsigned int idCount = 0; char newid[15]; std::string id; for (unsigned int i = 0; i < m.getNumReactions(); i++) { Reaction *r = m.getReaction(i); unsigned int j; for (j = 0; j < r->getNumReactants(); j++) { SpeciesReference *sr = r->getReactant(j); if (sr->getDenominator() != 1) { long stoich = static_cast<long>(sr->getStoichiometry()); int denom = sr->getDenominator(); ASTNode *node = new ASTNode(); node->setValue(stoich, denom); if (l2 == true) { StoichiometryMath * sm = sr->createStoichiometryMath(); sm->setMath(node); } else { sprintf(newid, "speciesRefId_%u", idCount); id.assign(newid); idCount++; sr->setId(id); InitialAssignment * ar = m.createInitialAssignment(); ar->setSymbol(id); ar->setMath(node); sr->unsetStoichiometry(); } } } for (j = 0; j < r->getNumProducts(); j++) { SpeciesReference *sr = r->getProduct(j); if (sr->getDenominator() != 1) { long stoich = static_cast<long>(sr->getStoichiometry()); int denom = sr->getDenominator(); ASTNode *node = new ASTNode(); node->setValue(stoich, denom); if (l2 == true) { StoichiometryMath * sm = sr->createStoichiometryMath(); sm->setMath(node); } else { sprintf(newid, "speciesRefId_%u", idCount); id.assign(newid); idCount++; sr->setId(id); InitialAssignment * ar = m.createInitialAssignment(); ar->setSymbol(id); ar->setMath(node); sr->unsetStoichiometry(); } } } } }