From 2d9f06d7f0168272297deddf3cfa20085a136d59 Mon Sep 17 00:00:00 2001 From: Nikolaus Sonnenschein Date: Tue, 26 May 2015 16:35:36 +0200 Subject: [PATCH] Weird fix to problem where removing and re-adding the biomass reaction would raise an exception claiming that the reverse variable is already present in the solver variable container. --- cameo/core/solver_based_model.py | 4 +++- tests/test_solver_based_model.py | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/cameo/core/solver_based_model.py b/cameo/core/solver_based_model.py index c73af2da9..da768a51c 100644 --- a/cameo/core/solver_based_model.py +++ b/cameo/core/solver_based_model.py @@ -229,6 +229,7 @@ def _populate_solver(self, reaction_list): if self.solver.objective is None: self.solver.objective = self.solver.interface.Objective(objective_expression, name='obj', direction='max') else: + self.solver.objective.variables # TODO: remove this weird hack. Looks like some weird issue with lazy objective expressions in CPLEX and GLPK interface in optlang. self.solver.objective += objective_expression def add_reactions(self, reaction_list): @@ -246,7 +247,8 @@ def add_reactions(self, reaction_list): def remove_reactions(self, the_reactions): for reaction in the_reactions: - self.solver.remove(reaction.id) + self.solver.remove(reaction.forward_variable) + self.solver.remove(reaction.reverse_variable) super(SolverBasedModel, self).remove_reactions(the_reactions) def add_demand(self, metabolite, prefix="DM_"): diff --git a/tests/test_solver_based_model.py b/tests/test_solver_based_model.py index 886e3b64e..9b001ddef 100644 --- a/tests/test_solver_based_model.py +++ b/tests/test_solver_based_model.py @@ -564,6 +564,10 @@ def test_remove_reactions(self): for reaction in reactions_to_remove: self.assertNotIn(reaction.id, list(self.model.solver.variables.keys())) + self.model.add_reactions(reactions_to_remove) + for reaction in reactions_to_remove: + self.assertIn(reaction, self.model.reactions) + def test_add_demand(self): for metabolite in self.model.metabolites: demand_reaction = self.model.add_demand(metabolite, prefix="DemandReaction_")