def promote_local_variables(doc: libsbml.SBMLDocument, suffix: str = "_promoted") -> libsbml.SBMLDocument: """Promotes local variables in SBMLDocument. Manipulates SBMLDocument in place! :param doc: SBMLDocument :param suffix: str suffix for promoted SBML :return: SBMLDocument with promoted parameters """ model: libsbml.Model = doc.getModel() model.setId(f"{model.id}{suffix}") # promote local parameters props = libsbml.ConversionProperties() props.addOption("promoteLocalParameters", True, "Promotes all Local Parameters to Global ones") if doc.convert(props) != libsbml.LIBSBML_OPERATION_SUCCESS: logger.error(f"Promotion of local parameters failed: {doc}") else: logger.info(f"Promotion of local paramters successful: {doc}") return doc
def flatten_sbml_doc(doc: libsbml.SBMLDocument, output_path: Path = None, leave_ports: bool = True) -> libsbml.SBMLDocument: """Flatten SBMLDocument. Validation should be performed before the flattening and is not part of the flattening routine. If an output path is provided the file is written to the output path. :param doc: SBMLDocument to flatten. :param output_path: Path to write flattended SBMLDocument to :param leave_ports: flag to leave ports :return: SBMLDocument """ error_count = doc.getNumErrors() if error_count > 0: if doc.getError(0).getErrorId() == libsbml.XMLFileUnreadable: # Handle case of unreadable file here. logger.error("SBML error in doc: libsbml.XMLFileUnreadable") elif doc.getError(0).getErrorId() == libsbml.XMLFileOperationError: # Handle case of other file error here. logger.error("SBML error in doc: libsbml.XMLFileOperationError") else: # Handle other error cases here. logger.error("SBML errors in doc, see SBMLDocument error log.") # converter options libsbml.CompFlatteningConverter props = libsbml.ConversionProperties() props.addOption("flatten comp", True) # Invokes CompFlatteningConverter props.addOption("leave_ports", leave_ports) # Indicates whether to leave ports props.addOption("abortIfUnflattenable", "none") # flatten current = time.perf_counter() result = doc.convert(props) flattened_status = result == libsbml.LIBSBML_OPERATION_SUCCESS lines = [ "", "-" * 120, str(doc), "{:<25}: {}".format("flattened", str(flattened_status).upper()), "{:<25}: {:.3f}".format("flatten time (ms)", time.perf_counter() - current), "-" * 120, ] info = bcolors.BOLD + "\n".join(lines) + bcolors.ENDC if flattened_status: logger.info(bcolors.OKGREEN + info + bcolors.ENDC) else: logger.error(bcolors.FAIL + info + bcolors.ENDC) raise ValueError( "SBML could not be flattend due to errors in the SBMLDocument.") if output_path is not None: write_sbml(doc, filepath=output_path) logger.info(f"Flattened model created: '{output_path}'") return doc