From 53ca985343250835c85b3630be9ac4c857310bae Mon Sep 17 00:00:00 2001
From: Peter Schubert <Peter.Schubert@hhu.de>
Date: Thu, 5 Oct 2023 11:38:34 +0200
Subject: [PATCH] gba_stoic_problem solved via ipopt using jax autograd and jit

---
 xbanalysis/model/fbc_gene_product.py |  5 ++++-
 xbanalysis/model/fbc_objective.py    |  9 ++++++---
 xbanalysis/model/xba_compartment.py  |  4 ++++
 xbanalysis/model/xba_function.py     |  4 ++++
 xbanalysis/model/xba_model.py        |  6 +++---
 xbanalysis/model/xba_parameter.py    |  5 ++++-
 xbanalysis/model/xba_reaction.py     |  5 ++++-
 xbanalysis/model/xba_species.py      | 11 +++++++++--
 xbanalysis/model/xba_unit_def.py     |  5 ++++-
 xbanalysis/problems/fba_problem.py   |  6 +++++-
 10 files changed, 47 insertions(+), 13 deletions(-)

diff --git a/xbanalysis/model/fbc_gene_product.py b/xbanalysis/model/fbc_gene_product.py
index efd5477..2551c33 100644
--- a/xbanalysis/model/fbc_gene_product.py
+++ b/xbanalysis/model/fbc_gene_product.py
@@ -8,5 +8,8 @@ class FbcGeneProduct:
 
     def __init__(self, s_fbc_gene_product):
         self.id = s_fbc_gene_product.name
-        self.name = s_fbc_gene_product.get('name', '')
+        if ('name' in s_fbc_gene_product) and (type(s_fbc_gene_product['name']) == str):
+            self.name = s_fbc_gene_product['name']
+        else:
+            self.name = self.id
         self.label = s_fbc_gene_product['label']
diff --git a/xbanalysis/model/fbc_objective.py b/xbanalysis/model/fbc_objective.py
index 4db5d45..a0a8bd0 100644
--- a/xbanalysis/model/fbc_objective.py
+++ b/xbanalysis/model/fbc_objective.py
@@ -10,10 +10,13 @@ class FbcObjective:
 
     def __init__(self, s_fbc_objective):
         self.id = s_fbc_objective.name
-        self.name = s_fbc_objective.get('name', '')
+        if ('name' in s_fbc_objective) and (type(s_fbc_objective['name']) == str):
+            self.name = s_fbc_objective['name']
+        else:
+            self.name = self.id
         self.direction = s_fbc_objective['type']
         self.active = s_fbc_objective['active']
-        self.coefficiants = {}
+        self.coefficients = {}
         for reac_ref in sbmlxdf.record_generator(s_fbc_objective['fluxObjectives']):
             params = sbmlxdf.extract_params(reac_ref)
-            self.coefficiants[params['reac']] = float(params['coef'])
+            self.coefficients[params['reac']] = float(params['coef'])
diff --git a/xbanalysis/model/xba_compartment.py b/xbanalysis/model/xba_compartment.py
index d243910..6fabc0e 100644
--- a/xbanalysis/model/xba_compartment.py
+++ b/xbanalysis/model/xba_compartment.py
@@ -13,6 +13,10 @@ class XbaCompartment:
 
     def __init__(self, s_compartment):
         self.id = s_compartment.name
+        if ('name' in s_compartment) and (type(s_compartment['name']) == str):
+            self.name = s_compartment['name']
+        else:
+            self.name = self.id
         self.name = s_compartment.get('name', self.id)
         if 'size' in s_compartment:
             self.size = s_compartment['size']
diff --git a/xbanalysis/model/xba_function.py b/xbanalysis/model/xba_function.py
index 950bea1..ba93f1f 100644
--- a/xbanalysis/model/xba_function.py
+++ b/xbanalysis/model/xba_function.py
@@ -11,6 +11,10 @@ class XbaFunction:
 
     def __init__(self, s_function):
         self.id = s_function.name
+        if ('name' in s_function) and (type(s_function['name']) == str):
+            self.name = s_function['name']
+        else:
+            self.name = self.id
         self.name = s_function.get('name', self.id)
         self.math = s_function['math']
 
diff --git a/xbanalysis/model/xba_model.py b/xbanalysis/model/xba_model.py
index f4b3c54..f065b9c 100644
--- a/xbanalysis/model/xba_model.py
+++ b/xbanalysis/model/xba_model.py
@@ -33,18 +33,18 @@ class XbaModel:
             print(f'{sbml_file} seems not to be a valid SBML model')
             return
         model_dict = sbml_model.to_df()
+        self.id = model_dict['modelAttrs'].id
+        self.name = model_dict['modelAttrs'].get('name', self.id)
         self.unit_defs = {udid: XbaUnitDef(row)
                           for udid, row in model_dict['unitDefs'].iterrows()}
         self.compartments = {cid: XbaCompartment(row)
                              for cid, row in model_dict['compartments'].iterrows()}
         self.parameters = {pid: XbaParameter(row)
                            for pid, row in model_dict['parameters'].iterrows()}
+        self.functions = {}
         if 'funcDefs' in model_dict:
             self.functions = {fid: XbaFunction(row)
                               for fid, row in model_dict['funcDefs'].iterrows()}
-        else:
-            self.functions = {}
-
         self.species = {sid: XbaSpecies(row)
                         for sid, row in model_dict['species'].iterrows()}
         self.reactions = {rid: XbaReaction(row, self.species, self.functions, self.compartments)
diff --git a/xbanalysis/model/xba_parameter.py b/xbanalysis/model/xba_parameter.py
index b86a0c3..b73c077 100644
--- a/xbanalysis/model/xba_parameter.py
+++ b/xbanalysis/model/xba_parameter.py
@@ -9,7 +9,10 @@ class XbaParameter:
 
     def __init__(self, s_parameter):
         self.id = s_parameter.name
-        self.name = s_parameter.get('name', self.id)
+        if ('name' in s_parameter) and (type(s_parameter['name']) == str):
+            self.name = s_parameter['name']
+        else:
+            self.name = self.id
         self.value = s_parameter['value']
         self.constant = s_parameter['constant']
         self.units = s_parameter['units']
diff --git a/xbanalysis/model/xba_reaction.py b/xbanalysis/model/xba_reaction.py
index 619520b..20cb42c 100644
--- a/xbanalysis/model/xba_reaction.py
+++ b/xbanalysis/model/xba_reaction.py
@@ -14,7 +14,10 @@ class XbaReaction:
 
     def __init__(self, s_reaction, species, functions, compartments):
         self.id = s_reaction.name
-        self.name = s_reaction.get('name', self.id)
+        if ('name' in s_reaction) and (type(s_reaction['name']) == str):
+            self.name = s_reaction['name']
+        else:
+            self.name = self.id
         if ('sboterm' in s_reaction) and (type(s_reaction['sboterm']) is str):
             self.sboterm = SboTerm(s_reaction['sboterm'])
         self.reaction_string = s_reaction['reactionString']
diff --git a/xbanalysis/model/xba_species.py b/xbanalysis/model/xba_species.py
index 71706e7..f8f9449 100644
--- a/xbanalysis/model/xba_species.py
+++ b/xbanalysis/model/xba_species.py
@@ -12,7 +12,10 @@ class XbaSpecies:
 
     def __init__(self, s_species):
         self.id = s_species.name
-        self.name = s_species.get('name', self.id)
+        if ('name' in s_species) and (type(s_species['name']) == str):
+            self.name = s_species['name']
+        else:
+            self.name = self.id
         # set sboterm to 000247 to support Flux Balance Analysis
         self.sboterm = SboTerm(s_species.get('sboterm', 'SBO:0000247'))
         self.compartment = s_species['compartment']
@@ -20,8 +23,12 @@ class XbaSpecies:
         self.boundary = s_species['boundaryCondition']
         if 'initialConcentration' in s_species:
             self.initial_conc = s_species['initialConcentration']
-        if 'units' in s_species:
+        if 'substanceUnits' in s_species:
             self.units = s_species['substanceUnits']
+        if 'fbcCharge' in s_species:
+            self.charge = s_species['fbcCharge']
+        if 'fbcChemicalFormula' in s_species:
+            self.formula = s_species['fbcChemicalFormula']
         if 'xmlAnnotation' in s_species:
             attrs = sbmlxdf.extract_xml_attrs(s_species['xmlAnnotation'], ns=xml_gba_ns, token='molecule')
             if 'weight_Da' in attrs:
diff --git a/xbanalysis/model/xba_unit_def.py b/xbanalysis/model/xba_unit_def.py
index 5cd1326..72a1180 100644
--- a/xbanalysis/model/xba_unit_def.py
+++ b/xbanalysis/model/xba_unit_def.py
@@ -11,7 +11,10 @@ class XbaUnitDef:
 
     def __init__(self, s_unit_def):
         self.id = s_unit_def.name
-        self.name = s_unit_def.get('name', self.id)
+        if ('name' in s_unit_def) and (type(s_unit_def['name']) == str):
+            self.name = s_unit_def['name']
+        else:
+            self.name = self.id
         self.units = [XbaUnit(sbmlxdf.extract_params(u))
                       for u in sbmlxdf.record_generator(s_unit_def['units'])]
 
diff --git a/xbanalysis/problems/fba_problem.py b/xbanalysis/problems/fba_problem.py
index bebc68b..7c328c6 100644
--- a/xbanalysis/problems/fba_problem.py
+++ b/xbanalysis/problems/fba_problem.py
@@ -1,3 +1,7 @@
+"""Implementation of FbaProblem Class.
+
+Peter Schubert, HHU Duesseldorf, September 2022
+"""
 import numpy as np
 import math
 from scipy import sparse
@@ -70,7 +74,7 @@ class FbaProblem:
             if fbc_obj.active is True:
                 # self.obj_id = fbc_obj.id
                 self.obj_dir = fbc_obj.direction
-                self.objective = fbc_obj.coefficiants
+                self.objective = fbc_obj.coefficients
                 break
 
         # lp problem will only be created once required.
-- 
GitLab