Exemple #1
0
/** @cond doxygenLibsbmlInternal */
int Replacing::performConversions(SBase* replacement, ASTNode** conversionFactor)
{
  SBMLDocument* doc = getSBMLDocument();
  int ret = convertConversionFactor(conversionFactor);
  if (ret != LIBSBML_OPERATION_SUCCESS) {
    //convertConversionFactor sets its own error messages.
    return ret;
  }
  if (*conversionFactor==NULL) {
    return ret;
  }
  if (replacement==NULL) {
    if (doc) {
      string error = "Internal error in Replacing::performConversions:  cannot perform a conversion of NULL.";
      doc->getErrorLog()->logPackageError("comp", CompModelFlatteningFailed, getPackageVersion(), getLevel(), getVersion(), error, getLine(), getColumn());
    }
    return LIBSBML_OPERATION_FAILED;
  }

  SBase* replaced = getReferencedElement();
  if (replaced==NULL) {
    //getReferencedElement sets its own error messages.
    return LIBSBML_INVALID_OBJECT;
  }
  Model* replacedmod = const_cast<Model*>(CompBase::getParentModel(replaced));
  if (replacedmod==NULL) {
    if (doc) {
      string error = "Unable to perform conversion of replacement in Replacing::performConversions:  No model parent could be found for replacement";
      if (replacement->isSetId()) {
        error += replacement->getId() + ".";
      }
      doc->getErrorLog()->logPackageError("comp", CompModelFlatteningFailed, getPackageVersion(), getLevel(), getVersion(), error, getLine(), getColumn());
    }
    return LIBSBML_INVALID_OBJECT;
  }

  if (!replacement->isSetId()) {
    //If the replacement has no ID, it won't need to be converted anywhere.  Only theoretically possible for non-core SBase elements.
    return LIBSBML_OPERATION_SUCCESS;
  }
  string id = replacement->getId();
  ASTNode replacementAST(AST_NAME);
  replacementAST.setName(id.c_str());
  ASTNode divide(AST_DIVIDE);
  divide.addChild(replacementAST.deepCopy());
  divide.addChild((*conversionFactor)->deepCopy());
  List* allElements = replacedmod->getAllElements();
  for (unsigned int e=0; e<allElements->getSize(); e++) {
    SBase* element = static_cast<SBase*>(allElements->get(e));
    element->replaceSIDWithFunction(id, &divide);
    element->multiplyAssignmentsToSIdByFunction(id, *conversionFactor);
  }
  delete allElements;
  return ret;
}