/* declares constant = false for any L1 compartment/parameter * assigned by a rule */ void Model::addConstantAttribute() { unsigned int n; // parameters and compartments are declared to have constant=true // by default. Since in L1 the constant attribute didnt exist // parameters/compartments that are the subjcet of rules must have // the value changed for ( n = 0; n < getNumParameters(); n++) { if (getRule(getParameter(n)->getId()) != NULL) { getParameter(n)->setConstant(false); } } for ( n = 0; n < getNumCompartments(); n++) { if (getRule(getCompartment(n)->getId()) != NULL) { getCompartment(n)->setConstant(false); } } }
CMetab * UndoSpeciesData::createObjectIn(CModel *pModel) { if (pModel == NULL) return NULL; createDependentObjects(pModel); if (pModel->getCompartments().getIndex(mCompartment) == C_INVALID_INDEX) return NULL; CCompartment * pCompartment = &pModel->getCompartments()[getCompartment()]; if (pCompartment == NULL) return NULL; if (pCompartment->getMetabolites().getIndex(getName()) != C_INVALID_INDEX) return NULL; CMetab *pSpecies = pModel->createMetabolite(getName(), getCompartment(), getIConc(), getStatus()); if (pSpecies == NULL) return NULL; mKey = pSpecies->getKey(); return pSpecies; }
/** Adds a state to the state map, the creation queue and to a Compartment with the given id @param state @param compartmentId @return Returns the amount of state space allocated. @warning Once you pass a state pointer into this method, you must not use it again. It may be invalid. */ size_t osc::StateHandler::addState(osc::State *state, osc::compartment_id_t const &compartmentId, osc::u16 priority) { DEBUG_STACK_FRAME; state->retain(); osc::Compartment * compartment = getCompartment(compartmentId); compartment->writeLock(); // Truncating as defined in RFC 3320 6.2.2 size_t max_size = compartment->totalStateMemoryAvailable(); if( (state->getStateSize() + 64) > max_size ) { state->truncate(max_size - 64); } // Add to the global state map. If this state is a duplicate of // a state that is already present, then addState will // delete the state that was passed in and return a pointer // to its doppelganger. state = addState(state); compartment->addState(state, priority); compartment->unlock(); compartment->release(); state->release(); return 0; }
/* in L1 spatialDimensions did not exist as an attribute * but was considered to be '3' * L3 does not require the attribute and will * only record it is officially set */ void Model::setSpatialDimensions(double dims) { for (unsigned int n = 0; n < getNumCompartments(); n++) { getCompartment(n)->setSpatialDimensions(dims); } }
/* converting to l1 any metaid attributes should be removed */ void Model::removeMetaId() { unsigned int n, i; unsetMetaId(); for (n = 0; n < getNumUnitDefinitions(); n++) { getUnitDefinition(n)->unsetMetaId(); for (i = 0; i < getUnitDefinition(n)->getNumUnits(); i++) { getUnitDefinition(n)->getUnit(i)->unsetMetaId(); } } for (n = 0; n < getNumCompartments(); n++) { getCompartment(n)->unsetMetaId(); } for (n = 0; n < getNumSpecies(); n++) { getSpecies(n)->unsetMetaId(); } for (n = 0; n < getNumParameters(); n++) { getParameter(n)->unsetMetaId(); } for (n = 0; n < getNumRules(); n++) { getRule(n)->unsetMetaId(); } for (n = 0; n < getNumReactions(); n++) { getReaction(n)->unsetMetaId(); for (i = 0; i < getReaction(n)->getNumReactants(); i++) { getReaction(n)->getReactant(i)->unsetMetaId(); } for (i = 0; i < getReaction(n)->getNumProducts(); i++) { getReaction(n)->getProduct(i)->unsetMetaId(); } if (getReaction(n)->isSetKineticLaw()) { getReaction(n)->getKineticLaw()->unsetMetaId(); } } }
/** Debugging-only method */ void osc::StateHandler::processChanges(osc::StateChanges & changes, osc::compartment_id_t const &compartmentId) { DEBUG_STACK_FRAME; osc::Compartment * compartment = getCompartment (compartmentId); if (!compartment) { return; } compartment->writeLock(); processChanges(changes, *compartment); compartment->unlock(); compartment->release(); }
void Model::removeDuplicateTopLevelAnnotations() { unsigned int i, n; this->removeDuplicateAnnotations(); if (getNumFunctionDefinitions() > 0) { getListOfFunctionDefinitions()->removeDuplicateAnnotations(); for (i = 0; i < getNumFunctionDefinitions(); i++) { getFunctionDefinition(i)->removeDuplicateAnnotations(); } } if (getNumUnitDefinitions() > 0) { getListOfUnitDefinitions()->removeDuplicateAnnotations(); for (i = 0; i < getNumUnitDefinitions(); i++) { getUnitDefinition(i)->removeDuplicateAnnotations(); getUnitDefinition(i)->getListOfUnits()->removeDuplicateAnnotations(); for (n = 0; n < getUnitDefinition(i)->getNumUnits(); n++) { getUnitDefinition(i)->getUnit(n)->removeDuplicateAnnotations(); } } } if (getNumCompartmentTypes() > 0) { getListOfCompartmentTypes()->removeDuplicateAnnotations(); for (i = 0; i < getNumCompartmentTypes(); i++) { getCompartmentType(i)->removeDuplicateAnnotations(); } } if (getNumSpeciesTypes() > 0) { getListOfSpeciesTypes()->removeDuplicateAnnotations(); for (i = 0; i < getNumSpeciesTypes(); i++) { getSpeciesType(i)->removeDuplicateAnnotations(); } } if (getNumCompartments() > 0) { getListOfCompartments()->removeDuplicateAnnotations(); for (i = 0; i < getNumCompartments(); i++) { getCompartment(i)->removeDuplicateAnnotations(); } } if (getNumSpecies() > 0) { getListOfSpecies()->removeDuplicateAnnotations(); for (i = 0; i < getNumSpecies(); i++) { getSpecies(i)->removeDuplicateAnnotations(); } } if (getNumParameters() > 0) { getListOfParameters()->removeDuplicateAnnotations(); for (i = 0; i < getNumParameters(); i++) { getParameter(i)->removeDuplicateAnnotations(); } } if (getNumInitialAssignments() > 0) { getListOfInitialAssignments()->removeDuplicateAnnotations(); for (i = 0; i < getNumInitialAssignments(); i++) { getInitialAssignment(i)->removeDuplicateAnnotations(); } } if (getNumConstraints() > 0) { getListOfConstraints()->removeDuplicateAnnotations(); for (i = 0; i < getNumConstraints(); i++) { getConstraint(i)->removeDuplicateAnnotations(); } } if (getNumRules() > 0) { getListOfRules()->removeDuplicateAnnotations(); for (i = 0; i < getNumRules(); i++) { getRule(i)->removeDuplicateAnnotations(); } } if (getNumReactions() > 0) { getListOfReactions()->removeDuplicateAnnotations(); for (i = 0; i < getNumReactions(); i++) { Reaction * r = getReaction(i); r->removeDuplicateAnnotations(); if (r->getNumReactants() > 0) { r->getListOfReactants()->removeDuplicateAnnotations(); for (n = 0; n < r->getNumReactants(); n++) { r->getReactant(n)->removeDuplicateAnnotations(); } } if (r->getNumProducts() > 0) { r->getListOfProducts()->removeDuplicateAnnotations(); for (n = 0; n < r->getNumProducts(); n++) { r->getProduct(n)->removeDuplicateAnnotations(); } } if (r->getNumModifiers() > 0) { r->getListOfModifiers()->removeDuplicateAnnotations(); for (n = 0; n < r->getNumModifiers(); n++) { r->getModifier(n)->removeDuplicateAnnotations(); } } if (r->isSetKineticLaw()) { r->getKineticLaw()->removeDuplicateAnnotations(); if (r->getKineticLaw()->getNumParameters() > 0) { r->getKineticLaw()->getListOfParameters() ->removeDuplicateAnnotations(); for (n = 0; n < r->getKineticLaw()->getNumParameters(); n++) { r->getKineticLaw()->getParameter(n)->removeDuplicateAnnotations(); } } } } } if (getNumEvents() > 0) { getListOfEvents()->removeDuplicateAnnotations(); for (i = 0; i < getNumEvents(); i++) { getEvent(i)->removeDuplicateAnnotations(); if (getEvent(i)->getNumEventAssignments() > 0) { getEvent(i)->getListOfEventAssignments()->removeDuplicateAnnotations(); for (n = 0; n < getEvent(i)->getNumEventAssignments(); n++) { getEvent(i)->getEventAssignment(n)->removeDuplicateAnnotations(); } } } } }
void Model::removeSBOTermsNotInL2V2(bool strict) { unsigned int n, i; if (strict == true) { for (n = 0; n < getNumUnitDefinitions(); n++) { getUnitDefinition(n)->unsetSBOTerm(); for (i = 0; i < getUnitDefinition(n)->getNumUnits(); i++) { getUnitDefinition(n)->getUnit(i)->unsetSBOTerm(); } } for (n = 0; n < getNumCompartments(); n++) { getCompartment(n)->unsetSBOTerm(); } for (n = 0; n < getNumSpecies(); n++) { getSpecies(n)->unsetSBOTerm(); } for (n = 0; n < getNumCompartmentTypes(); n++) { getCompartmentType(n)->unsetSBOTerm(); } for (n = 0; n < getNumSpeciesTypes(); n++) { getSpeciesType(n)->unsetSBOTerm(); } for (n = 0; n < getNumReactions(); n++) { for (i = 0; i < getReaction(n)->getNumReactants(); i++) { if (getReaction(n)->getReactant(i)->isSetStoichiometryMath()) { getReaction(n)->getReactant(i)->getStoichiometryMath()->unsetSBOTerm(); } } for (i = 0; i < getReaction(n)->getNumProducts(); i++) { if (getReaction(n)->getProduct(i)->isSetStoichiometryMath()) { getReaction(n)->getProduct(i)->getStoichiometryMath()->unsetSBOTerm(); } } } for (n = 0; n < getNumEvents(); n++) { if (getEvent(n)->isSetTrigger()) { getEvent(n)->getTrigger()->unsetSBOTerm(); } if (getEvent(n)->isSetDelay()) { getEvent(n)->getDelay()->unsetSBOTerm(); } } } }
void Model::removeSBOTerms(bool strict) { unsigned int n, i; if (strict == true) { unsetSBOTerm(); for (n = 0; n < getNumUnitDefinitions(); n++) { getUnitDefinition(n)->unsetSBOTerm(); for (i = 0; i < getUnitDefinition(n)->getNumUnits(); i++) { getUnitDefinition(n)->getUnit(i)->unsetSBOTerm(); } } for (n = 0; n < getNumCompartments(); n++) { getCompartment(n)->unsetSBOTerm(); } for (n = 0; n < getNumSpecies(); n++) { getSpecies(n)->unsetSBOTerm(); } for (n = 0; n < getNumParameters(); n++) { getParameter(n)->unsetSBOTerm(); } for (n = 0; n < getNumRules(); n++) { getRule(n)->unsetSBOTerm(); } for (n = 0; n < getNumReactions(); n++) { getReaction(n)->unsetSBOTerm(); for (i = 0; i < getReaction(n)->getNumReactants(); i++) { getReaction(n)->getReactant(i)->unsetSBOTerm(); if (getReaction(n)->getReactant(i)->isSetStoichiometryMath()) { getReaction(n)->getReactant(i)->getStoichiometryMath()->unsetSBOTerm(); } } for (i = 0; i < getReaction(n)->getNumProducts(); i++) { getReaction(n)->getProduct(i)->unsetSBOTerm(); if (getReaction(n)->getProduct(i)->isSetStoichiometryMath()) { getReaction(n)->getProduct(i)->getStoichiometryMath()->unsetSBOTerm(); } } for (i = 0; i < getReaction(n)->getNumModifiers(); i++) { getReaction(n)->getModifier(i)->unsetSBOTerm(); } if (getReaction(n)->isSetKineticLaw()) { getReaction(n)->getKineticLaw()->unsetSBOTerm(); } } for (n = 0; n < getNumFunctionDefinitions(); n++) { getFunctionDefinition(n)->unsetSBOTerm(); } for (n = 0; n < getNumEvents(); n++) { getEvent(n)->unsetSBOTerm(); for (i = 0; i < getEvent(n)->getNumEventAssignments(); i++) { getEvent(n)->getEventAssignment(i)->unsetSBOTerm(); } if (getEvent(n)->isSetTrigger()) { getEvent(n)->getTrigger()->unsetSBOTerm(); } if (getEvent(n)->isSetDelay()) { getEvent(n)->getDelay()->unsetSBOTerm(); } } } }
/* in L1 and L2 there were built in values for key units * such as 'volume', 'length', 'area', 'substance' and 'time' * In L3 these have been removed - thus if a model uses one of these * it needs a unitDefinition to define it */ void Model::addDefinitionsForDefaultUnits() { /* create a list of unit values */ IdList unitsUsed; unsigned int n; bool implicitVolume = false; bool implicitArea = false; bool implicitLength = false; bool implicitSubstance = false; for (n = 0; n < getNumCompartments(); n++) { if (getCompartment(n)->isSetUnits()) { unitsUsed.append(getCompartment(n)->getUnits()); } else { if (getCompartment(n)->getSpatialDimensions() == 3) { implicitVolume = true; getCompartment(n)->setUnits("volume"); } else if (getCompartment(n)->getSpatialDimensions() == 2) { implicitArea = true; getCompartment(n)->setUnits("area"); } else if (getCompartment(n)->getSpatialDimensions() == 1) { implicitLength = true; getCompartment(n)->setUnits("length"); } } } for (n = 0; n < getNumSpecies(); n++) { if (getSpecies(n)->isSetSubstanceUnits()) { unitsUsed.append(getSpecies(n)->getSubstanceUnits()); } else { implicitSubstance = true; getSpecies(n)->setSubstanceUnits("substance"); } if (getSpecies(n)->isSetSpatialSizeUnits()) unitsUsed.append(getSpecies(n)->getSpatialSizeUnits()); } for (n = 0; n < getNumParameters(); n++) { if (getParameter(n)->isSetUnits()) unitsUsed.append(getParameter(n)->getUnits()); } if (getUnitDefinition("volume") == NULL) { if (unitsUsed.contains("volume") || implicitVolume) { UnitDefinition * ud = createUnitDefinition(); ud->setId("volume"); Unit * u = ud->createUnit(); u->setKind(UnitKind_forName("litre")); u->setScale(0); u->setExponent(1.0); u->setMultiplier(1.0); setVolumeUnits("volume"); } else { setVolumeUnits("litre"); } } else { setVolumeUnits("volume"); } if (getUnitDefinition("substance") == NULL) { if (unitsUsed.contains("substance") || implicitSubstance) { UnitDefinition * ud = createUnitDefinition(); ud->setId("substance"); Unit * u = ud->createUnit(); u->setKind(UnitKind_forName("mole")); u->setScale(0); u->setExponent(1.0); u->setMultiplier(1.0); setSubstanceUnits("substance"); setExtentUnits("substance"); } else { setSubstanceUnits("mole"); setExtentUnits("mole"); } } else { setSubstanceUnits("substance"); setExtentUnits("substance"); } if (getUnitDefinition("area") == NULL) { UnitDefinition * ud = createUnitDefinition(); ud->setId("area"); Unit * u = ud->createUnit(); u->setKind(UnitKind_forName("metre")); u->setScale(0); u->setExponent(2.0); u->setMultiplier(1.0); setAreaUnits("area"); } else { setAreaUnits("area"); } if (getUnitDefinition("length") == NULL) { if (unitsUsed.contains("length") || implicitLength) { UnitDefinition * ud = createUnitDefinition(); ud->setId("length"); Unit * u = ud->createUnit(); u->setKind(UnitKind_forName("metre")); u->setScale(0); u->setExponent(1.0); u->setMultiplier(1.0); setLengthUnits("length"); } else { setLengthUnits("metre"); } } else { setLengthUnits("length"); } if (getUnitDefinition("time") == NULL) { setTimeUnits("second"); } else { setTimeUnits("time"); } }
void Model::assignRequiredValues() { // when converting to L3 some attributes which have default values in L1/L2 // but are required in L3 are not present or set unsigned int i, n; if (getNumUnitDefinitions() > 0) { for (i = 0; i < getNumUnitDefinitions(); i++) { for (n = 0; n < getUnitDefinition(i)->getNumUnits(); n++) { Unit *u = getUnitDefinition(i)->getUnit(n); if (!u->isSetExponent()) u->setExponent(1.0); if (!u->isSetScale()) u->setScale(0); if (!u->isSetMultiplier()) u->setMultiplier(1.0); } } } if (getNumCompartments() > 0) { for (i = 0; i < getNumCompartments(); i++) { Compartment *c = getCompartment(i); c->setConstant(c->getConstant()); } } if (getNumSpecies() > 0) { for (i = 0; i < getNumSpecies(); i++) { Species * s = getSpecies(i); s->setBoundaryCondition(s->getBoundaryCondition()); s->setHasOnlySubstanceUnits(s->getHasOnlySubstanceUnits()); s->setConstant(s->getConstant()); } } if (getNumParameters() > 0) { for (i = 0; i < getNumParameters(); i++) { Parameter * p = getParameter(i); p->setConstant(p->getConstant()); } } if (getNumReactions() > 0) { for (i = 0; i < getNumReactions(); i++) { Reaction * r = getReaction(i); r->setFast(r->getFast()); r->setReversible(r->getReversible()); if (r->getNumReactants() > 0) { for (n = 0; n < r->getNumReactants(); n++) { SpeciesReference *sr = r->getReactant(n); if (sr->isSetStoichiometryMath()) { sr->setConstant(false); } else { sr->setConstant(true); } } } if (r->getNumProducts() > 0) { for (n = 0; n < r->getNumProducts(); n++) { SpeciesReference *sr = r->getProduct(n); if (sr->isSetStoichiometryMath()) { sr->setConstant(false); } else { sr->setConstant(true); } } } } } if (getNumEvents() > 0) { for (i = 0; i < getNumEvents(); i++) { Event * e = getEvent(i); e->setUseValuesFromTriggerTime(e->getUseValuesFromTriggerTime()); if (e->isSetTrigger()) { Trigger *t = e->getTrigger(); t->setPersistent(true); t->setInitialValue(true); } } } }