def __init__(self, reactions=None, essential_reactions=None, use_nullspace_simplification=True, *args, **kwargs): super(ReactionKnockoutOptimization, self).__init__(*args, **kwargs) if reactions is None: self.reactions = set([r.id for r in self.model.reactions]) else: self.reactions = reactions logger.debug("Computing essential reactions...") if essential_reactions is None: self.essential_reactions = set( r.id for r in find_essential_reactions(self.model, processes=1)) else: self.essential_reactions = set([ r.id for r in find_essential_reactions(self.model, processes=1) ]) self.essential_reactions.update(essential_reactions) if use_nullspace_simplification: ns = nullspace(create_stoichiometric_array(self.model)) dead_ends = set(find_blocked_reactions_nullspace(self.model, ns=ns)) exchanges = set(self.model.boundary) reactions = [ r for r in self.model.reactions if (r not in exchanges) and (r not in dead_ends) and ( r.id not in self.essential_reactions) ] groups = find_coupled_reactions_nullspace(self.model, ns=ns) groups_keys = [ set(group) for group in groups if any(r.id in reactions for r in group) ] reduced_set = reduce_reaction_set(reactions, groups_keys) to_keep = [r.id for r in reduced_set] else: groups = None to_keep = set(r.id for r in self.model.reactions) to_keep.difference_update(r.id for r in self.model.boundary) to_keep.difference_update(self.essential_reactions) to_keep = list(to_keep) self.representation = to_keep self._target_type = REACTION_KNOCKOUT_TYPE self._decoder = decoders.ReactionSetDecoder(self.representation, self.model, groups=groups) self._evaluator = evaluators.KnockoutEvaluator( model=self.model, decoder=self._decoder, objective_function=self.objective_function, simulation_method=self._simulation_method, simulation_kwargs=self._simulation_kwargs)
def test_coupled_reactions(self, core_model): # If a reaction is essential, all coupled reactions are essential essential_reactions = find_essential_reactions(core_model) coupled_reactions = structural.find_coupled_reactions_nullspace(core_model) for essential_reaction in essential_reactions: for group in coupled_reactions: assert isinstance(group, dict) if essential_reaction in group: assert all(group_reaction in essential_reactions for group_reaction in group)
def test_reactions_in_group_become_blocked_if_one_is_removed( self, core_model): essential_reactions = core_model.essential_reactions() coupled_reactions = structural.find_coupled_reactions_nullspace( core_model) for group in coupled_reactions: representative = pick_one(group) if representative not in essential_reactions: with TimeMachine() as tm: assert core_model == representative.model tm(do=partial(core_model.remove_reactions, [representative], delete=False), undo=partial(core_model.add_reactions, [representative])) # # FIXME: Hack because of optlang queue issues with GLPK # core_model.solver.update() assert representative not in core_model.reactions assert representative.forward_variable not in core_model.solver.variables assert representative.reverse_variable not in core_model.solver.variables assert representative not in core_model.reactions assert representative.model is None blocked_reactions = find_blocked_reactions(core_model) assert all(r in blocked_reactions for r in group if r != representative) assert representative in core_model.reactions coupled_reactions = structural.find_coupled_reactions(core_model) for group in coupled_reactions: representative = pick_one(group) if representative not in essential_reactions: with TimeMachine() as tm: fwd_var_name = representative.forward_variable.name rev_var_name = representative.reverse_variable.name assert core_model == representative.model tm(do=partial(core_model.remove_reactions, [representative], delete=False), undo=partial(core_model.add_reactions, [representative])) # # FIXME: Hack because of optlang queue issues with GLPK # core_model.solver.update() assert representative not in core_model.reactions assert fwd_var_name not in core_model.solver.variables assert rev_var_name not in core_model.solver.variables assert representative not in core_model.reactions assert representative.model is None blocked_reactions = find_blocked_reactions(core_model) assert representative not in core_model.reactions assert all(r in blocked_reactions for r in group if r != representative) assert representative in core_model.reactions
def __init__(self, reactions=None, essential_reactions=None, use_nullspace_simplification=True, *args, **kwargs): super(ReactionKnockoutOptimization, self).__init__(*args, **kwargs) if reactions is None: self.reactions = set([r.id for r in self.model.reactions]) else: self.reactions = reactions logger.debug("Computing essential reactions...") if essential_reactions is None: self.essential_reactions = set(r.id for r in find_essential_reactions(self.model, processes=1)) else: self.essential_reactions = set([r.id for r in find_essential_reactions(self.model, processes=1)]) self.essential_reactions.update(essential_reactions) if use_nullspace_simplification: ns = nullspace(create_stoichiometric_array(self.model)) dead_ends = set(find_blocked_reactions_nullspace(self.model, ns=ns)) exchanges = set(self.model.boundary) reactions = [ r for r in self.model.reactions if (r not in exchanges) and ( r not in dead_ends) and ( r.id not in self.essential_reactions) ] groups = find_coupled_reactions_nullspace(self.model, ns=ns) groups_keys = [set(group) for group in groups if any(r.id in reactions for r in group)] reduced_set = reduce_reaction_set(reactions, groups_keys) to_keep = [r.id for r in reduced_set] else: groups = None to_keep = set(r.id for r in self.model.reactions) to_keep.difference_update(r.id for r in self.model.boundary) to_keep.difference_update(self.essential_reactions) to_keep = list(to_keep) self.representation = to_keep self._target_type = REACTION_KNOCKOUT_TYPE self._decoder = decoders.ReactionSetDecoder(self.representation, self.model, groups=groups) self._evaluator = evaluators.KnockoutEvaluator(model=self.model, decoder=self._decoder, objective_function=self.objective_function, simulation_method=self._simulation_method, simulation_kwargs=self._simulation_kwargs)
def test_reactions_in_group_become_blocked_if_one_is_removed(self, core_model): essential_reactions = find_essential_reactions(core_model) coupled_reactions = structural.find_coupled_reactions_nullspace(core_model) for group in coupled_reactions: representative = pick_one(group) if representative not in essential_reactions: with core_model: assert core_model == representative.model core_model.remove_reactions([representative]) # # FIXME: Hack because of optlang queue issues with GLPK # core_model.solver.update() assert representative not in core_model.reactions assert representative.forward_variable not in core_model.solver.variables assert representative.reverse_variable not in core_model.solver.variables assert representative not in core_model.reactions assert representative.model is None blocked_reactions = find_blocked_reactions(core_model) assert all(r in blocked_reactions for r in group if r != representative) assert representative in core_model.reactions coupled_reactions = structural.find_coupled_reactions(core_model) for group in coupled_reactions: representative = pick_one(group) if representative not in essential_reactions: with core_model: fwd_var_name = representative.forward_variable.name rev_var_name = representative.reverse_variable.name assert core_model == representative.model core_model.remove_reactions([representative]) # # FIXME: Hack because of optlang queue issues with GLPK # core_model.solver.update() assert representative not in core_model.reactions assert fwd_var_name not in core_model.solver.variables assert rev_var_name not in core_model.solver.variables assert representative not in core_model.reactions assert representative.model is None blocked_reactions = find_blocked_reactions(core_model) assert representative not in core_model.reactions assert all(r in blocked_reactions for r in group if r != representative) assert representative in core_model.reactions
def _reduce_to_nullspace(self, reactions): self.reaction_groups = find_coupled_reactions_nullspace(self._model) reaction_groups_keys = [set(group) for group in self.reaction_groups] reduced_reactions = reduce_reaction_set(reactions, reaction_groups_keys) return reduced_reactions
def _reduce_to_nullspace(self, reactions): reaction_groups = find_coupled_reactions_nullspace(self._model) reduced_reactions = reduce_reaction_set(reactions, reaction_groups) return reduced_reactions