void CModelExpansion::duplicateGlobalQuantity(const CModelValue* source, const std::string & index, const SetOfModelElements & sourceSet, ElementsMap & emap) { //if the source object has already been duplicated: do nothing if (emap.exists(source)) return; //try creating the object until we find a name that is not yet used CModelEntity* newObj; std::ostringstream infix; do { std::ostringstream name; name << source->getObjectName() << infix.str() << index; newObj = mpModel->createModelValue(name.str(), source->getInitialValue()); infix << "_"; } while (!newObj); //add duplicated object to the map emap.add(source, newObj); //status newObj->setStatus(source->getStatus()); //expression (for assignment or ODE) newObj->setExpression(source->getExpression()); updateExpression(newObj->getExpressionPtr(), index, sourceSet, emap); //initial expression newObj->setInitialExpression(source->getInitialExpression()); updateExpression(newObj->getInitialExpressionPtr(), index, sourceSet, emap); newObj->setNotes(source->getNotes()); newObj->setMiriamAnnotation(source->getMiriamAnnotation(), newObj->getKey(), source->getKey()); }
// virtual bool CModelParameter::updateModel() { bool success = true; if (mpObject != NULL) { switch (mType) { case Model: { CModel * pModel = static_cast< CModel * >(mpObject); if (!pModel->isAutonomous()) { pModel->setInitialValue(mValue); } else { pModel->setInitialValue(0.0); } } break; case Compartment: case Species: case ModelValue: { CModelEntity * pEntity = static_cast< CModelEntity * >(mpObject); if (pEntity->getStatus() != CModelEntity::ASSIGNMENT) { pEntity->setInitialValue(mValue); if (mIsInitialExpressionValid) { pEntity->setInitialExpression(getInitialExpression()); } } } break; case ReactionParameter: { CCopasiParameter * pParameter = static_cast< CCopasiParameter * >(mpObject); CReaction * pReaction = static_cast< CReaction * >(mpObject->getObjectAncestor("Reaction")); if (mIsInitialExpressionValid && getInitialExpression() != "") { CModel * pModel = mpParent->getModel(); assert(pModel != NULL); std::vector< CCopasiContainer * > ListOfContainer; ListOfContainer.push_back(pModel); CCopasiObjectName CN = static_cast< CEvaluationNodeObject * >(mpInitialExpression->getRoot())->getObjectCN(); CCopasiObject * pObject = pModel->getObjectDataModel()->ObjectFromName(ListOfContainer, CN); assert(pObject != NULL); // We assign the object value pParameter->setValue(* (C_FLOAT64 *) pObject->getValuePointer()); // We map the parameter to the global quantity pReaction->setParameterMapping(pParameter->getObjectName(), pObject->getObjectParent()->getKey()); } else { pParameter->setValue(mValue); // We need to remove the existing mapping to a global quantity1. pReaction->setParameterMapping(pParameter->getObjectName(), pParameter->getKey()); } } break; default: success = false; break; } } return success; }