# 17.1.1.8.1.4. cobra.util.solver¶

Additional helper functions for the optlang solvers.

All functions integrate well with the context manager, meaning that all operations defined here are automatically reverted when used in a with model: block.

The functions defined here together with the existing model functions should allow you to implement custom flux analysis methods with ease.

## 17.1.1.8.1.4.1. Module Contents¶

### 17.1.1.8.1.4.1.1. Classes¶

 Components Define an object for adding absolute expressions.

### 17.1.1.8.1.4.1.2. Functions¶

 linear_reaction_coefficients(model: Model, reactions: Optional[List[‘Reaction’]] = None) → Dict[‘Reaction’, float] Retrieve coefficient for the reactions in a linear objective. _valid_atoms(model: Model, expression: optlang.symbolics.Basic) → bool Check whether a sympy expression references the correct variables. set_objective(model: Model, value: Union[optlang.interface.Objective, optlang.symbolics.Basic, Dict[‘Reaction’, float]], additive: bool = False) → None Set the model objective. interface_to_str(interface: Union[str, ModuleType]) → str Give a string representation for an optlang interface. get_solver_name(mip: bool = False, qp: bool = False) → str Select a solver for a given optimization problem. choose_solver(model: Model, solver: Optional[str] = None, qp: bool = False) → ModuleType Choose a solver given a solver name and model. Check whether the chosen solver is valid. add_cons_vars_to_problem(model: Model, what: Union[List[CONS_VARS], Tuple[CONS_VARS], Components], **kwargs) → None Add variables and constraints to a model’s solver object. remove_cons_vars_from_problem(model: Model, what: Union[List[CONS_VARS], Tuple[CONS_VARS], Components]) → None Remove variables and constraints from a model’s solver object. add_absolute_expression(model: Model, expression: str, name: str = ‘abs_var’, ub: Optional[float] = None, difference: float = 0.0, add: bool = True) → Components Add the absolute value of an expression to the model. fix_objective_as_constraint(model: Model, fraction: float = 1.0, bound: Optional[float] = None, name: str = ‘fixed_objective_{}’) → float Fix current objective as an additional constraint. check_solver_status(status: str = None, raise_error: bool = False) → None Perform standard checks on a solver’s status. assert_optimal(model: Model, message: str = ‘Optimization failed’) → None Assert model solver status is optimal. add_lp_feasibility(model: Model) → None Add a new objective and variables to ensure a feasible solution. add_lexicographic_constraints(model: Model, objectives: List[‘Reaction’], objective_direction: Union[str, List[str]] = ‘max’) → pd.Series Successively optimize separate targets in a specific order.
cobra.util.solver.CONS_VARS[source]
cobra.util.solver.logger[source]
cobra.util.solver.solvers[source]
cobra.util.solver.qp_solvers = ['cplex', 'gurobi', 'osqp'][source]
cobra.util.solver.has_primals[source]
class cobra.util.solver.Components[source]

Define an object for adding absolute expressions.

variable :optlang.interface.Variable[source]
upper_constraint :optlang.interface.Constraint[source]
lower_constraint :optlang.interface.Constraint[source]
cobra.util.solver.linear_reaction_coefficients(model: Model, reactions: Optional[List['Reaction']] = None) → Dict['Reaction', float][source]

Retrieve coefficient for the reactions in a linear objective.

Parameters
• model (cobra.Model) – The cobra model defining the linear objective.

• reactions (list of cobra.Reaction, optional) – An optional list of the reactions to get the coefficients for. By default, all reactions are considered (default None).

Returns

A dictionary where the keys are the reaction objects and the values are the corresponding coefficient. Empty dictionary if there are no linear terms in the objective.

Return type

dict

cobra.util.solver._valid_atoms(model: Model, expression: optlang.symbolics.Basic) → bool[source]

Check whether a sympy expression references the correct variables.

Parameters
• model (cobra.Model) – The model in which to check for variables.

• expression (sympy.Basic) – A sympy expression.

Returns

True if all referenced variables are contained in model, False otherwise.

Return type

bool

cobra.util.solver.set_objective(model: Model, value: Union[optlang.interface.Objective, optlang.symbolics.Basic, Dict['Reaction', float]], additive: bool = False) → None[source]

Set the model objective.

Parameters
• model (cobra.Model) – The model to set the objective for.

• value (optlang.interface.Objective, optlang.symbolics.Basic, dict) – If the model objective is linear, then the value can be a new optlang.interface.Objective or a dictionary with linear coefficients where each key is a reaction and the corresponding value is the new coefficient (float). If the objective is non-linear and additive is True, then only values of class optlang.interface.Objective, are accepted.

Raises
• ValueError – If model objective is non-linear and the value is a dict.

• TypeError – If the type of value is not one of the accepted ones.

cobra.util.solver.interface_to_str(interface: Union[str, ModuleType]) → str[source]

Give a string representation for an optlang interface.

Parameters

interface (str, ModuleType) – Full name of the interface in optlang or cobra representation. For instance, ‘optlang.glpk_interface’ or ‘optlang-glpk’.

Returns

The name of the interface as a string.

Return type

str

cobra.util.solver.get_solver_name(mip: bool = False, qp: bool = False) → str[source]

Select a solver for a given optimization problem.

Parameters
• mip (bool) – True if the solver requires mixed integer linear programming capabilities.

• qp (bool) – True if the solver requires quadratic programming capabilities.

Returns

The name of the feasible solver.

Return type

str

Raises

SolverNotFound – If no suitable solver could be found.

cobra.util.solver.choose_solver(model: Model, solver: Optional[str] = None, qp: bool = False) → ModuleType[source]

Choose a solver given a solver name and model.

This will choose a solver compatible with the model and required capabilities. Also respects model.solver where it can.

Parameters
• model (cobra.Model) – The model for which to choose the solver.

• solver (str, optional) – The name of the solver to be used (default None).

• qp (boolean, optional) – True if the solver needs quadratic programming capabilities (default False).

Returns

Valid solver for the problem.

Return type

optlang.interface

Raises

SolverNotFound – If no suitable solver could be found.

cobra.util.solver.check_solver(obj)[source]

Check whether the chosen solver is valid.

Check whether chosen solver is valid and also warn when using a specialized solver. Will return the optlang interface for the requested solver.

Parameters

obj (str or optlang.interface or optlang.interface.Model) – The chosen solver.

Raises

SolverNotFound – If the solver is not valid.

cobra.util.solver.add_cons_vars_to_problem(model: Model, what: Union[List[CONS_VARS], Tuple[CONS_VARS], Components], **kwargs) → None[source]

Add variables and constraints to a model’s solver object.

Useful for variables and constraints that can not be expressed with reactions and lower/upper bounds. It will integrate with the model’s context manager in order to revert changes upon leaving the context.

Parameters
• model (cobra.Model) – The model to which to add the variables and constraints.

• what (list or tuple of optlang.interface.Variable or) – optlang.interface.Constraint The variables and constraints to add to the model.

• **kwargs (keyword arguments) – Keyword arguments passed to solver’s add() method.

cobra.util.solver.remove_cons_vars_from_problem(model: Model, what: Union[List[CONS_VARS], Tuple[CONS_VARS], Components]) → None[source]

Remove variables and constraints from a model’s solver object.

Useful to temporarily remove variables and constraints from a model’s solver object.

Parameters
• model (cobra.Model) – The model from which to remove the variables and constraints.

• what (list or tuple of optlang.interface.Variable or) – optlang.interface.Constraint The variables and constraints to remove from the model.

cobra.util.solver.add_absolute_expression(model: Model, expression: str, name: str = 'abs_var', ub: Optional[float] = None, difference: float = 0.0, add: bool = True) → Components[source]

Add the absolute value of an expression to the model.

Also defines a variable for the absolute value that can be used in other objectives or constraints.

Parameters
• model (cobra.Model) – The model to which to add the absolute expression.

• expression (str) – Must be a valid symbolic expression within the model’s solver object. The absolute value is applied automatically on the expression.

• name (str, optional) – The name of the newly created variable (default “abs_var”).

• ub (positive float, optional) – The upper bound for the variable (default None).

• difference (positive float, optional) – The difference between the expression and the variable (default 0.0).

• add (bool, optional) – Whether to add the variable to the model at once (default True).

Returns

A named tuple with variable and two constraints (upper_constraint, lower_constraint) describing the new variable and the constraints that assign the absolute value of the expression to it.

Return type

Components

cobra.util.solver.fix_objective_as_constraint(model: Model, fraction: float = 1.0, bound: Optional[float] = None, name: str = 'fixed_objective_{}') → float[source]

Fix current objective as an additional constraint.

When adding constraints to a model, such as done in pFBA which minimizes total flux, these constraints can become too powerful, resulting in solutions that satisfy optimality but sacrifices too much for the original objective function. To avoid that, we can fix the current objective value as a constraint to ignore solutions that give a lower (or higher depending on the optimization direction) objective value than the original model.

When done with the model as a context, the modification to the objective will be reverted when exiting that context.

Parameters
• model (cobra.Model) – The model to operate on.

• fraction (float, optional) – The fraction of the optimum the objective is allowed to reach (default 1.0).

• bound (float, optional) – The bound to use instead of fraction of maximum optimal value. If not None, fraction is ignored (default None).

• name (str, optional) – Name of the objective. May contain one “{}” placeholder which is filled with the name of the old objective (default “fixed_objective_{}”).

Returns

The value of the optimized objective * fraction

Return type

float

cobra.util.solver.check_solver_status(status: str = None, raise_error: bool = False) → None[source]

Perform standard checks on a solver’s status.

Parameters
• status (str, optional) – The status string obtained from the solver (default None).

• raise_error (bool, optional) – If True, raise error or display warning if False (default False).

Returns

Return type

None

Warns

UserWarning – If status is not optimal and raise_error is set to True.

Raises

OptimizationError – If status is None or is not optimal and raise_error is set to True.

cobra.util.solver.assert_optimal(model: Model, message: str = 'Optimization failed') → None[source]

Assert model solver status is optimal.

Do nothing if model solver status is optimal, otherwise throw appropriate exception depending on the status.

Parameters
• model (cobra.Model) – The model to check the solver status for.

• message (str, optional) – Message for the exception if solver status is not optimal (default “Optimization failed”).

Returns

Return type

None

Raises

OptimizationError – If solver status is not optimal.

cobra.util.solver.add_lp_feasibility(model: Model) → None[source]

Add a new objective and variables to ensure a feasible solution.

The optimized objective will be zero for a feasible solution and otherwise represent the distance from feasibility (please see [1]_ for more information).

Parameters

model (cobra.Model) – The model whose feasibility is to be tested.

Returns

Return type

None

References

1

Gomez, Jose A., Kai Höffner, and Paul I. Barton.

“DFBAlab: A Fast and Reliable MATLAB Code for Dynamic Flux Balance Analysis.” BMC Bioinformatics 15, no. 1 (December 18, 2014): 409. https://doi.org/10.1186/s12859-014-0409-8.

cobra.util.solver.add_lexicographic_constraints(model: Model, objectives: List['Reaction'], objective_direction: Union[str, List[str]] = 'max') → pd.Series[source]

Successively optimize separate targets in a specific order.

For each objective, optimize the model and set the optimal value as a constraint. Proceed in the order of the objectives given. Due to the specific order this is called lexicographic FBA [1]_. This procedure is useful for returning unique solutions for a set of important fluxes. Typically this is applied to exchange fluxes.

Parameters
• model (cobra.Model) – The model to be optimized.

• objectives (list of cobra.Reaction) – A list of reactions (or objectives) in the model for which unique fluxes are to be determined.

• objective_direction (str or list of str, optional) – The desired objective direction for each reaction (if a list) or the objective direction to use for all reactions (default “max”).

Returns

A pandas Series containing the optimized fluxes for each of the given reactions in objectives.

Return type

pandas.Series

References

1

Gomez, Jose A., Kai Höffner, and Paul I. Barton.

“DFBAlab: A Fast and Reliable MATLAB Code for Dynamic Flux Balance Analysis.” BMC Bioinformatics 15, no. 1 (December 18, 2014): 409. https://doi.org/10.1186/s12859-014-0409-8.