Source code for cobra.solvers.glpk

"""bindings to the glpk solver through pyglpk"""
# because both this module and the library are named glpk
from __future__ import absolute_import
from glpk import LPX

from ..core.Solution import Solution


# mappers from cobra representation to glpk
variable_kind_dict = {
    'continuous': float,
    'integer': int}
# mappers from glpk representations to cobra
status_dict = {
    'opt': 'optimal',
    'nofeas': 'infeasible',
    'unbnd': 'unbounded'}


[docs]def create_problem(cobra_model, objective_sense="maximize", lp=None): if lp is None: lp = LPX() # Create empty problem instance lp.name = cobra_model.id lp.rows.add(len(cobra_model.metabolites)) lp.cols.add(len(cobra_model.reactions)) if objective_sense == 'maximize': lp.obj.maximize = True elif objective_sense == 'minimize': lp.obj.maximize = False else: raise ValueError("objective_sense not 'maximize' or 'minimize'") # create metabolites/constraints as rows for i, r in enumerate(lp.rows): metabolite = cobra_model.metabolites[i] r.name = metabolite.id b = float(metabolite._bound) c = metabolite._constraint_sense # constraint sense is set by changing the bounds if c == 'E': r.bounds = (b, b) elif c == 'L': r.bounds = (None, b) elif c == 'G': r.bounds = (b, None) else: raise ValueError("%s is not a valid constraint_sense" % c) # create reactions/variables as columns for i, c in enumerate(lp.cols): reaction = cobra_model.reactions[i] c.name = reaction.id c.kind = variable_kind_dict[reaction.variable_kind] c.bounds = (reaction.lower_bound, reaction.upper_bound) lp.obj[i] = float(reaction.objective_coefficient) # create S matrix lp.matrix = [(int(i), int(j), c) \ for (i, j), c in cobra_model.to_array_based_model().S.todok().iteritems()] return lp
[docs]def solve_problem(lp): lp.simplex() try: status = status_dict[lp.status] except: status = "unknown error: " + str(lp.status) solution = Solution(status) solution.status = status if status == 'optimal': solution.objective_value = lp.obj.value solution.x_dict = dict((c.name, c.primal) for c in lp.cols) # return the duals as well as the primals for LPs if lp.kind == "float": solution.y_dict = dict((c.name, c.dual) for c in lp.cols) else: solution.y_dict = None return solution
[docs]def solve(cobra_model, objective_sense="maximize", **kwargs): return solve_problem(create_problem(cobra_model, objective_sense))