Source code for cobra.solvers
# attempt to import all working solvers in this directory
from __future__ import absolute_import
from os import name as __name
from sys import modules as __modules
from warnings import warn
__legacy_solver = False
solver_dict = {}
if __legacy_solver:
from .legacy import _optimize_glpk, _optimize_gurobi, _optimize_cplex
package_dict = {'glpk': 'from glpk import LPX',
'cplex': 'from cplex import Cplex',
'gurobi': 'from gurobipy import Model'}
if __name == 'java':
from .legacy_jython import _optimize_glpk
package_dict['glpk'] = 'from org.gnu.glpk import GLPK'
package_dict['gurobi'] = 'from gurobi import GRBModel'
solver_dict = {'glpk': _optimize_glpk,
'gurobi': _optimize_gurobi,
'cplex': _optimize_cplex}
for solver_name, solver_import in package_dict.iteritems():
try:
exec(solver_import)
except Exception, e:
#print e
solver_dict.pop(solver_name)
else:
#TODO: Enforce the solver interface
## create_problem: makes a solver problem object from a cobra.model and
## sets parameters (if possible)
## format_solution: Returns a cobra.Solution object. This is where one
## should dress the cobra.model with results if desired.
## get_status: converts a solver specific status flag to a cobra pie flag.
## set_parameter: takes solver specific parameter strings and sets them.
## solve: solves the optimization problem. this is where one should put
## in logic on what to try if the problem
## isn't optimal
## solve_problem: dumb and fast which will set parameters, if provided
##note that for some solvers
## update_problem: changes bounds and linear objective coefficient of the
## solver specific problem file, given the complementary cobra.mod
from os import listdir as _listdir
from os import path as _path
for i in _listdir(_path.split(_path.abspath(__file__))[0]):
if i.startswith("_") or i.startswith(".") or i == 'legacy.py':
continue
if not i.endswith(".py"):
continue
try:
m = i.strip(".py")
exec("from . import %s" % m)
solver_name = m
if solver_name.endswith('_solver'):
solver_name = solver_name[:-len('_solver')]
solver_dict[solver_name] = eval(m)
except Exception, e:
pass
del _path
del _listdir
del i
m = None
del m
[docs]def optimize(cobra_model, solver='glpk', error_reporting=True, **kwargs):
"""Wrapper to optimization solvers
"""
#If the default solver is not installed then use one of the others
try:
solver_function = solver_dict[solver]
except:
try:
solver, solver_function = solver_dict.items()[0]
except:
raise Exception("It appears that you do not have one of the supported solvers "+\
"(glpk, gurobi, or cplex) installed")
the_solution = None
if __legacy_solver:
def solve_problem(solver_function, kwargs):
return solver_function(cobra_model, **kwargs)
try:
the_solution = solve_problem(solver_function, kwargs)
except Exception, e:
if error_reporting:
print e
print '%s did not work'%solver
solver_keys = solver_dict.keys()
solver_keys.remove(solver)
for solver in solver_keys:
solver_function = solver_dict[solver]
try:
if error_reporting:
print "now trying %s"%solver
the_solution = solve_problem(solver_function, kwargs)
break
except Exception, e:
if error_reporting:
print e
print '%s did not work'%solver
continue
else:
the_solution = solver_function.solve(cobra_model, **kwargs)
#raise Exception("New style solvers not yet fully implemented")
#Add the solution to the model.
#if the_solution is None:
# return(the_solution)
#else:
return(the_solution['the_problem'])
del __name