_check if the observation table is closed.
        Args:
            None
        Returns:
            tuple (bool, str): True if the observation table is closed and false otherwise.
                               If the table is not closed the escaping string is returned.

def is_closed(self):
        """
        _check if the observation table is closed.
        Args:
            None
        Returns:
            tuple (bool, str): True if the observation table is closed and false otherwise.
                               If the table is not closed the escaping string is returned.
        """
        old_training_data = self.training_data
        self.training_data = {x: [] for x in self.sm_vector}
        for t in self.smi_vector:
            src_state = t[:-1]
            symbol = t[-1:]
            found = False
            for dst_state in self.sm_vector:
                if self.observation_table[dst_state] == self.observation_table[t]:
                    self._add_training_data(src_state, dst_state, symbol)
                    found = True
                    break
            if not found:
                return False, t

        assert self.training_data != old_training_data, \
            "No update happened from previous round. The algo will loop infinetely"
        return True, None