Skip to content

Commit

Permalink
Critical fix in add_reactions.
Browse files Browse the repository at this point in the history
Adding a new reaction would nullify an existing objective.
  • Loading branch information
phantomas1234 committed May 7, 2015
1 parent e2c77e5 commit a5f259d
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 3 deletions.
9 changes: 6 additions & 3 deletions cameo/core/solver_based_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ def _populate_solver(self, reaction_list):
constr_terms[metabolite.id].append(sympy.Mul._from_args([sympy.RealNumber(-1*coeff), reverse_variable]))

if reaction.objective_coefficient != 0.:
objective_terms.append(sympy.Mul._from_args((sympy.RealNumber(reaction.objective_coefficient), reaction.flux_expression)))
objective_terms.append(reaction.objective_coefficient * reaction.flux_expression)

for met_id, terms in six.iteritems(constr_terms):
expr = sympy.Add._from_args(terms)
Expand All @@ -225,8 +225,11 @@ def _populate_solver(self, reaction_list):
except KeyError:
self.solver._add_constraint(self.solver.interface.Constraint(expr, name=met_id, lb=0, ub=0), sloppy=True)

objective_expression = sympy.Add._from_args(objective_terms)
self.solver.objective = self.solver.interface.Objective(objective_expression, name='obj', direction='max')
objective_expression = sympy.Add(*objective_terms)
if self.solver.objective is None:
self.solver.objective = self.solver.interface.Objective(objective_expression, name='obj', direction='max')
else:
self.solver.objective += objective_expression

def add_reactions(self, reaction_list):
cloned_reaction_list = list()
Expand Down
5 changes: 5 additions & 0 deletions tests/test_solver_based_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -506,10 +506,15 @@ def test_add_reactions(self):
r2 = Reaction('r2')
r2.add_metabolites({Metabolite('A'): -1, Metabolite('C'): 1, Metabolite('D'): 1})
r2.lower_bound, r2.upper_bound = 0., 999999.
r2.objective_coefficient = 3.
self.model.add_reactions([r1, r2])
self.assertEqual(self.model.reactions[-2], r1)
self.assertEqual(self.model.reactions[-1], r2)
self.assertTrue(isinstance(self.model.reactions[-2].reverse_variable, self.model.solver.interface.Variable))
self.assertEqual(self.model.objective.expression.coeff(self.model.reactions.Biomass_Ecoli_core_N_LPAREN_w_FSLASH_GAM_RPAREN__Nmet2.forward_variable), 1.)
self.assertEqual(self.model.objective.expression.coeff(self.model.reactions.Biomass_Ecoli_core_N_LPAREN_w_FSLASH_GAM_RPAREN__Nmet2.reverse_variable), -1.)
self.assertEqual(self.model.objective.expression.coeff(self.model.reactions.r2.forward_variable), 3.)
self.assertEqual(self.model.objective.expression.coeff(self.model.reactions.r2.reverse_variable), -3.)

def test_all_objects_point_to_all_other_correct_objects(self):
model = load_model(os.path.join(TESTDIR, 'data/EcoliCore.xml'))
Expand Down

0 comments on commit a5f259d

Please sign in to comment.