void CFunction::load(CReadConfig & configBuffer, CReadConfig::Mode mode) { // cleanup(); C_INT32 Type; mode = CReadConfig::SEARCH; configBuffer.getVariable("User-defined", "C_INT32", &Type, mode); switch (Type) { case 1: setType(UserDefined); break; default: fatalError(); } configBuffer.getVariable("Reversible", "C_INT32", &mReversible); mode = CReadConfig::SEARCH; std::string tmp; configBuffer.getVariable("FunctionName", "string", &tmp, mode); setObjectName(tmp); configBuffer.getVariable("Description", "string", &tmp); setInfix(tmp); // For older file version the parameters have to be build from information // dependend on the function type. Luckilly, only user defined functions are // the only ones occuring in those files. }
CMassAction::CMassAction(const TriLogic & reversible, const CCopasiContainer * pParent): CFunction((reversible == TriTrue) ? "Mass action (reversible)" : "Mass action (irreversible)", pParent, CFunction::MassAction) { CONSTRUCTOR_TRACE; if (reversible != TriFalse && reversible != TriTrue) CCopasiMessage(CCopasiMessage::ERROR, MCMassAction + 1); if (reversible == TriTrue) setInfix(Infix[0]); else setInfix(Infix[1]); }
// This is only used when reading Gepasi Files void CKinFunction::createParameters() { CCopasiVectorN < CFunctionParameter > Substrates; CCopasiVectorN < CFunctionParameter > Products; CCopasiVectorN < CFunctionParameter > Modifiers; CCopasiVectorN < CFunctionParameter > Parameters; CCopasiVectorN < CFunctionParameter > Volumes; size_t i, imax = mNodes.size(); CFunctionParameter *pParameter; for (i = 0; i < imax; i++) { if (mNodes[i]->getType() == N_IDENTIFIER) { // We need to check that we have no reserved name. const char *Reserved[] = {"pi", "exponentiale", "true", "false", "infinity", "nan", "PI", "EXPONENTIALE", "TRUE", "FALSE", "INFINITY", "NAN" }; std::string Name = mNodes[i]->getName(); size_t j, jmax = 12; for (j = 0; j < jmax; j++) if (Name == Reserved[j]) break; if (j != jmax) { // It is save to prepend the identifyer with '_' since this is not allowed in // Gepasi but within COPASI. std::string OldName = Name; Name = "_" + Name; // We have to replace the corresponding CEvaluationNodes to reflect the change. std::vector< CEvaluationNode * >::iterator it = mpNodeList->begin(); std::vector< CEvaluationNode * >::iterator end = mpNodeList->end(); for (; it != end; ++it) if (((*it)->getType() & 0xFF000000) == CEvaluationNode::CONSTANT && (*it)->getData() == OldName) (*it)->setData(Name); // The Infix has changed we need to update it. setInfix(mpRoot->buildInfix()); } pParameter = new CFunctionParameter(Name); pParameter->setType(CFunctionParameter::FLOAT64); switch (mNodes[i]->getSubtype()) { case N_SUBSTRATE: pParameter->setUsage(CFunctionParameter::SUBSTRATE); if (Substrates.getIndex(pParameter->getObjectName()) == C_INVALID_INDEX) Substrates.add(pParameter, false); else pdelete(pParameter); break; case N_PRODUCT: pParameter->setUsage(CFunctionParameter::PRODUCT); if (Products.getIndex(pParameter->getObjectName()) == C_INVALID_INDEX) Products.add(pParameter, false); else pdelete(pParameter); break; case N_MODIFIER: pParameter->setUsage(CFunctionParameter::MODIFIER); if (Modifiers.getIndex(pParameter->getObjectName()) == C_INVALID_INDEX) Modifiers.add(pParameter, false); else pdelete(pParameter); break; case N_KCONSTANT: case N_NOP: pParameter->setUsage(CFunctionParameter::PARAMETER); if (Parameters.getIndex(pParameter->getObjectName()) == C_INVALID_INDEX) Parameters.add(pParameter, false); else pdelete(pParameter); break; case N_VOLUME: pParameter->setUsage(CFunctionParameter::VOLUME); if (Volumes.getIndex(pParameter->getObjectName()) == C_INVALID_INDEX) Volumes.add(pParameter, false); else pdelete(pParameter); break; default: pdelete(pParameter); fatalError(); } } } getVariables().cleanup(); imax = Substrates.size(); for (i = 0; i < imax; i++) getVariables().add(Substrates[i], true); Substrates.cleanup(); imax = Products.size(); for (i = 0; i < imax; i++) getVariables().add(Products[i], true); Products.cleanup(); imax = Modifiers.size(); for (i = 0; i < imax; i++) getVariables().add(Modifiers[i], true); Modifiers.cleanup(); imax = Parameters.size(); for (i = 0; i < imax; i++) getVariables().add(Parameters[i], true); Parameters.cleanup(); imax = Volumes.size(); for (i = 0; i < imax; i++) getVariables().add(Volumes[i], true); Volumes.cleanup(); }