Training_data is a dictionary from strings to lists.
        - Each string (key) is an access string
        - Each list (value) is a list of tuples (target_state, [symbols directed to that
        state]). These represent that a transition exists from the state used as key to the first
        part of the training_data to the dst state which is the first part of the tuple
        with all the symbols in the list in the SECOND part of the tuple.
        Args:
            src (str): The source state
            dst (str): The target state
            symbol (str): The transition symbol
        Returns:
            None

def _add_training_data(self, src, dst, symbol):
        """
        Training_data is a dictionary from strings to lists.
        - Each string (key) is an access string
        - Each list (value) is a list of tuples (target_state, [symbols directed to that
        state]). These represent that a transition exists from the state used as key to the first
        part of the training_data to the dst state which is the first part of the tuple
        with all the symbols in the list in the SECOND part of the tuple.
        Args:
            src (str): The source state
            dst (str): The target state
            symbol (str): The transition symbol
        Returns:
            None
        """
        src_data = self.training_data[src]
        for (s, v) in src_data:
            if s == dst:
                v.append(symbol)
                return
        src_data.append((dst, [symbol]))