def resting_complexes(self):
     """
     List of complexes enumerated that are within resting states.
     :py:meth:`.enumerate` must be called before access.
     """
     if self._resting_complexes is None:
         raise utils.PeppercornUsageError("enumerate not yet called!")
     return self._resting_complexes[:]
 def complexes(self):
     """
     List of complexes enumerated. :py:meth:`.enumerate` must be
     called before access.
     """
     if self._complexes is None:
         raise utils.PeppercornUsageError("enumerate not yet called!")
     return self._complexes[:]
 def resting_sets(self):
     """
     List of resting states enumerated. :py:meth:`.enumerate` must be
     called before access.
     """
     if self._resting_macrostates is None:
         raise utils.PeppercornUsageError("enumerate not yet called!")
     return self._resting_macrostates[:]
    def __init__(self, initial_complexes, initial_reactions=None):
        """
        Initializes the enumerator with a list of initial complexes.

        Note: The optional arguments 'strands' and 'domains' are there for
        backwards-compatibility and will be remove at some point. Ignoring them
        below breaks unit-tests - why? (1) sometimes complementary domains are
        specified that are actually not present in any of the complexes, (2)
        conflicts with strand names in the original kernel format (where
        explicit strand specifications are supported).
        """
        # System initialization
        self._initial_complexes = initial_complexes
        for cplx in initial_complexes:
            if not cplx.is_connected:
                raise utils.PeppercornUsageError('Initial complex is not connected: {}'.format(cplx))
        self._domains = self.get_domains(self._initial_complexes)

        # list containing all detailed reactions after enumeration
        if initial_reactions:
            self._reactions = initial_reactions
        else :
            self._reactions = []

        self._complexes = None
        self._resting_complexes = None
        self._transient_complexes = None
        self._resting_macrostates = None

        self.DFS = True
        self.interruptible = True
        self.interactive = False
        
        # Polymerization settings to prevent infinite looping
        self.max_complex_size = 6
        self.max_complex_count = 200
        self.max_reaction_count = 1000

        #
        # Set separation of timescales for *unimolecular* reactions.
        #
        #  ignore-reaction | resting-set | transient-state
        # -----------------|---------------|---------------> rate
        #                k_slow          k_fast
        #
        # Default: All unimolecular reactions are transient, none are ignored.
        #
        self._k_slow = 0 
        self._k_fast = 0
        self._p_min = 0
        self._p_loc = 0

        # Settings for reaction enumeration. 
        self._max_helix = True
        self._remote = True
        self._release_11 = 6
        self._release_1N = 6
 def transient_complexes(self):
     """
     List of complexes enumerated that are not within resting sets (e.g.
     complexes which are transient). :py:meth:`.enumerate` must be
     called before access.
     """
     if self._transient_complexes is None:
         raise utils.PeppercornUsageError("enumerate not yet called!")
     return self._transient_complexes[:]
 def release_cutoff(self):
     if self._release_11 != self._release_1N :
         raise utils.PeppercornUsageError('Ambiguous release cutoff request.')
     return self._release_11