[med-svn] [python-cobra] 01/03: Imported Upstream version 0.4.0b4

Afif Elghraoui afif-guest at moszumanska.debian.org
Sun Sep 13 09:29:08 UTC 2015


This is an automated email from the git hooks/post-receive script.

afif-guest pushed a commit to branch master
in repository python-cobra.

commit 831ebc4315c2e02fbdb5141387768dc79411abe4
Author: Afif Elghraoui <afif at ghraoui.name>
Date:   Sun Sep 13 02:07:01 2015 -0700

    Imported Upstream version 0.4.0b4
---
 appveyor.yml                   |  2 +-
 cobra/VERSION                  |  2 +-
 cobra/io/mat.py                |  8 +++++--
 cobra/solvers/__init__.py      |  2 ++
 cobra/solvers/cplex_solver.py  | 48 +++++++++++++++++++++++++-----------------
 cobra/solvers/gurobi_solver.py | 30 +++++++++++++++++++++-----
 6 files changed, 64 insertions(+), 28 deletions(-)

diff --git a/appveyor.yml b/appveyor.yml
index 6f2033e..c0feca7 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -32,7 +32,7 @@ init:
 
 install:
   - "powershell appveyor\\install.ps1"
-  - ps: Start-FileDownload 'https://opencobra.github.io/pypi_cobrapy_travis/six.py'
+  - ps: Start-FileDownload 'https://bitbucket.org/gutworth/six/raw/default/six.py'
   # Download glpk.h and glpk.lib (separate files for 32/64 bit)
   - ps: Start-FileDownload 'https://opencobra.github.io/pypi_cobrapy_travis/glpk.h'
   - "appveyor DownloadFile https://opencobra.github.io/pypi_cobrapy_travis/glpk.lib%PYTHON_ARCH% -FileName glpk.lib"
diff --git a/cobra/VERSION b/cobra/VERSION
index de998de..d4e083c 100644
--- a/cobra/VERSION
+++ b/cobra/VERSION
@@ -1 +1 @@
-0.4.0b3
+0.4.0b4
diff --git a/cobra/io/mat.py b/cobra/io/mat.py
index 3865e65..a7fb7f6 100644
--- a/cobra/io/mat.py
+++ b/cobra/io/mat.py
@@ -74,7 +74,7 @@ def load_matlab_model(infile_path, variable_name=None):
     raise Exception("no COBRA model found")
 
 
-def save_matlab_model(model, file_name):
+def save_matlab_model(model, file_name, varname=None):
     """Save the cobra model as a .mat file.
 
     This .mat file can be used directly in the MATLAB version of COBRA.
@@ -84,8 +84,12 @@ def save_matlab_model(model, file_name):
     file_name : str or file-like object
 
     """
+    if varname is None:
+        varname = str(model.id) \
+            if model.id is not None and len(model.id) > 0 \
+            else "exported_model"
     mat = create_mat_dict(model)
-    savemat(file_name, {str(model.id): mat},
+    savemat(file_name, {varname: mat},
             appendmat=True, oned_as="column")
 
 
diff --git a/cobra/solvers/__init__.py b/cobra/solvers/__init__.py
index ecdb24a..afd7d14 100644
--- a/cobra/solvers/__init__.py
+++ b/cobra/solvers/__init__.py
@@ -85,6 +85,8 @@ def get_solver_name(mip=False, qp=False):
         for solver_name in lp_order:
             if solver_name in solver_dict:
                 return solver_name
+        # none of them are in the list order - so return the first one
+        return list(solver_dict)[0]
     elif qp:  # mip does not yet matter for this determination
         for solver_name in qp_order:
             if solver_name in solver_dict:
diff --git a/cobra/solvers/cplex_solver.py b/cobra/solvers/cplex_solver.py
index 2e8d4dc..3b1ea14 100644
--- a/cobra/solvers/cplex_solver.py
+++ b/cobra/solvers/cplex_solver.py
@@ -11,6 +11,18 @@ from ..core.Solution import Solution
 from six.moves import zip
 from six import string_types, iteritems
 
+try:
+    from sympy import Basic, Number
+except:
+    class Basic:
+        pass
+
+def _float(value):
+    if isinstance(value, Basic) and not isinstance(value, Number):
+        return 0.
+    else:
+        return float(value)
+
 solver_name = 'cplex'
 _SUPPORTS_MILP = True
 
@@ -155,8 +167,8 @@ def create_problem(cobra_model, quadratic_component=None, **kwargs):
         set_parameter(lp, k, v)
     objective_coefficients = [float(x.objective_coefficient)
                               for x in cobra_model.reactions]
-    lower_bounds = [float(x.lower_bound) for x in cobra_model.reactions]
-    upper_bounds = [float(x.upper_bound) for x in cobra_model.reactions]
+    lower_bounds = [_float(x.lower_bound) for x in cobra_model.reactions]
+    upper_bounds = [_float(x.upper_bound) for x in cobra_model.reactions]
     variable_names = cobra_model.reactions.list_attr("id")
     variable_kinds = [variable_kind_dict[x.variable_kind] for x
                       in cobra_model.reactions]
@@ -174,28 +186,23 @@ def create_problem(cobra_model, quadratic_component=None, **kwargs):
                          ub=upper_bounds,
                          names=variable_names)
 
-   ## if relax_b:
-        ## range_values = zeros(len(cobra_model.metabolites))
-        ## b_values = array([x._bound for x in cobra_model.metabolties])
-        ## for the_nonzero in list(b_values.nonzero()[0]):
-        ##     range_values[the_nonzero] = -relax_b
-
     constraint_sense = []
     constraint_names = []
     constraint_limits = []
-    [(constraint_sense.append(x._constraint_sense),
-      constraint_names.append(x.id),
-      constraint_limits.append(float(x._bound)))
-     for x in cobra_model.metabolites]
+
+    for x in cobra_model.metabolites:
+        constraint_sense.append(x._constraint_sense)
+        constraint_names.append(x.id)
+        constraint_limits.append(float(x._bound))
 
     the_linear_expressions = []
-    #NOTE: This won't work with metabolites that aren't in any reaction
+    # NOTE: This won't work with metabolites that aren't in any reaction
     for the_metabolite in cobra_model.metabolites:
         variable_list = []
         coefficient_list = []
         for the_reaction in the_metabolite._reaction:
             variable_list.append(the_reaction.id)
-            coefficient_list.append(float(the_reaction._metabolites[the_metabolite]))
+            coefficient_list.append(_float(the_reaction._metabolites[the_metabolite]))
         the_linear_expressions.append(SparsePair(ind=variable_list,
                                                  val=coefficient_list))
     # Set objective to quadratic program
@@ -215,7 +222,7 @@ def create_problem(cobra_model, quadratic_component=None, **kwargs):
                                   senses=constraint_sense,
                                   names=constraint_names)
 
-    #Set the problem type as cplex doesn't appear to do this correctly
+    # Set the problem type as cplex doesn't appear to do this correctly
     problem_type = Cplex.problem_type.LP
     if Cplex.variables.type.integer in variable_kinds:
         if quadratic_component is not None:
@@ -245,10 +252,12 @@ def set_quadratic_objective(lp, quadratic_objective):
     for k, v in quadratic_component_scaled.items():
         lp.objective.set_quadratic_coefficients(int(k[0]), int(k[1]), v)
 
+
 def change_variable_bounds(lp, index, lower_bound, upper_bound):
     lp.variables.set_lower_bounds(index, lower_bound)
     lp.variables.set_upper_bounds(index, upper_bound)
 
+
 def change_variable_objective(lp, index, objective):
     lp.objective.set_linear(index, objective)
 
@@ -256,6 +265,7 @@ def change_variable_objective(lp, index, objective):
 def change_coefficient(lp, met_index, rxn_index, value):
     lp.linear_constraints.set_coefficients(met_index, rxn_index, value)
 
+
 def update_problem(lp, cobra_model, new_objective=None, **kwargs):
     """A performance tunable method for updating a model problem file
 
@@ -301,8 +311,8 @@ def solve(cobra_model, **kwargs):
     """
 
     """
-    #Start out with default parameters and then modify if
-    #new onese are provided
+    # Start out with default parameters and then modify if
+    # new onese are provided
     for i in ["new_objective", "update_problem", "the_problem"]:
         if i in kwargs:
             raise Exception("Option %s removed" % i)
@@ -313,7 +323,7 @@ def solve(cobra_model, **kwargs):
     # Create problem will get parameter defaults
     lp = create_problem(cobra_model, **kwargs)
 
-    ###Try to solve the problem using other methods if the first method doesn't work
+    # Try to solve the problem using other methods if first method doesn't work
     try:
         lp_method = the_parameters['lp_method']
     except:
@@ -321,7 +331,7 @@ def solve(cobra_model, **kwargs):
     the_methods = [1, 2, 3, 4, 5, 6]
     if lp_method in the_methods:
         the_methods.remove(lp_method)
-    #Start with the user specified method
+    # Start with the user specified method
     the_methods.insert(0, lp_method)
     for the_method in the_methods:
         try:
diff --git a/cobra/solvers/gurobi_solver.py b/cobra/solvers/gurobi_solver.py
index d69308e..57ad4ee 100644
--- a/cobra/solvers/gurobi_solver.py
+++ b/cobra/solvers/gurobi_solver.py
@@ -5,10 +5,24 @@ from itertools import izip
 
 from gurobipy import Model, LinExpr, GRB, QuadExpr
 
-
 from ..core.Solution import Solution
+
 from six import string_types
 
+try:
+    from sympy import Basic, Number
+except:
+    class Basic:
+        pass
+    Number = Basic
+
+
+def _float(value):
+    if isinstance(value, Basic) and not isinstance(value, Number):
+        return 0.
+    else:
+        return float(value)
+
 solver_name = 'gurobi'
 _SUPPORTS_MILP = True
 
@@ -47,6 +61,7 @@ objective_senses = {'maximize': GRB.MAXIMIZE, 'minimize': GRB.MINIMIZE}
 status_dict = {GRB.OPTIMAL: 'optimal', GRB.INFEASIBLE: 'infeasible',
                GRB.UNBOUNDED: 'unbounded', GRB.TIME_LIMIT: 'time_limit'}
 
+
 def get_status(lp):
     status = lp.status
     if status in status_dict:
@@ -55,9 +70,11 @@ def get_status(lp):
         status = 'failed'
     return status
 
+
 def get_objective_value(lp):
     return lp.ObjVal
 
+
 def format_solution(lp, cobra_model, **kwargs):
     status = get_status(lp)
     if status not in ('optimal', 'time_limit'):
@@ -70,11 +87,13 @@ def format_solution(lp, cobra_model, **kwargs):
             y = y_dict = None  # MIP's don't have duals
         else:
             y = [c.Pi for c in lp.getConstrs()]
-            y_dict = {m.id: value for m, value in izip(cobra_model.metabolites, y)}
+            y_dict = {m.id: value for m, value
+                      in izip(cobra_model.metabolites, y)}
         the_solution = Solution(objective_value, x=x, x_dict=x_dict, y=y,
                                 y_dict=y_dict, status=status)
     return(the_solution)
 
+
 def set_parameter(lp, parameter_name, parameter_value):
     if parameter_name == 'ModelSense' or parameter_name == "objective_sense":
         lp.setAttr('ModelSense', objective_senses[parameter_value])
@@ -87,6 +106,7 @@ def set_parameter(lp, parameter_name, parameter_value):
             parameter_value = METHODS[parameter_value]
         lp.setParam(parameter_name, parameter_value)
 
+
 def change_variable_bounds(lp, index, lower_bound, upper_bound):
     variable = lp.getVarByName(str(index))
     variable.lb = lower_bound
@@ -150,8 +170,8 @@ def create_problem(cobra_model, quadratic_component=None, **kwargs):
 
     # Create variables
     #TODO:  Speed this up
-    variable_list = [lp.addVar(float(x.lower_bound),
-                               float(x.upper_bound),
+    variable_list = [lp.addVar(_float(x.lower_bound),
+                               _float(x.upper_bound),
                                float(x.objective_coefficient),
                                variable_kind_dict[x.variable_kind],
                                str(i))
@@ -169,7 +189,7 @@ def create_problem(cobra_model, quadratic_component=None, **kwargs):
         constraint_coefficients = []
         constraint_variables = []
         for the_reaction in the_metabolite._reaction:
-            constraint_coefficients.append(the_reaction._metabolites[the_metabolite])
+            constraint_coefficients.append(_float(the_reaction._metabolites[the_metabolite]))
             constraint_variables.append(reaction_to_variable[the_reaction])
         #Add the metabolite to the problem
         lp.addConstr(LinExpr(constraint_coefficients, constraint_variables),

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/python-cobra.git



More information about the debian-med-commit mailing list