Beispiel #1
0
    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)
Beispiel #2
0
 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)
Beispiel #3
0
 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)
Beispiel #4
0
    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
Beispiel #5
0
    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)
Beispiel #6
0
    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
Beispiel #7
0
 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
Beispiel #8
0
 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