Пример #1
0
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.
}
Пример #2
0
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]);
}
Пример #3
0
// 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();
}