예제 #1
0
    def equivalence_query(self, dfa: DFA, start_time, timeout):
        """
        Tests whether the dfa is equivalent to the model by testing random words.
        If not equivalent returns an example
        """

        number_of_rounds = int(
            (1 / self.epsilon) * (np.log(1 / self.delta) + np.log(2) *
                                  (self._num_equivalence_asked + 1)))

        self._num_equivalence_asked = self._num_equivalence_asked + 1

        if self.is_counter_example_in_batches:
            batch_size = 200
            for i in range(int(number_of_rounds / batch_size) + 1):
                if time.time() - start_time > timeout:
                    return None
                batch = [
                    random_word(self.model.alphabet) for _ in range(batch_size)
                ]
                for x, y, w in zip(self.model.is_words_in_batch(batch),
                                   [dfa.is_word_in(w) for w in batch], batch):
                    if x != y:
                        return w
            return None

        else:
            for i in range(number_of_rounds):
                word = random_word(self.model.alphabet)
                if self.model.is_word_in(word) != dfa.is_word_in(word):
                    return word
            return None
예제 #2
0
    def model_subset_of_dfa_query(self, dfa: DFA, start_time, timeout):
        """
        Tests whether the model language is a subset of the dfa language by testing random words.
        If not subset returns an example
        """

        number_of_rounds = int(
            (1 / self.epsilon) * (np.log(1 / self.delta) + np.log(2) *
                                  (self._num_equivalence_asked + 1)))
        self._num_equivalence_asked = self._num_equivalence_asked + 1

        if isinstance(self.model, RNNLanguageClasifier):
            batch_size = 200
            for i in range(int(number_of_rounds / batch_size) + 1):
                if time.time() - start_time > timeout:
                    return None
                batch = [
                    random_word(self.model.alphabet) for _ in range(batch_size)
                ]
                for x, y, w in zip(
                        self.model.is_words_in_batch(batch) > 0.5,
                    [dfa.is_word_in(w) for w in batch], batch):
                    if x and (not y):
                        return w
            return None

        else:
            for i in range(number_of_rounds):
                word = random_word(self.model.alphabet)
                if self.model.is_word_in(word) != dfa.is_word_in(word):
                    return word
            return None
예제 #3
0
    def test_dfa(self):
        # dfa with the language a*b*
        dfa0 = DFA(1, {1, 2}, {1: {"a": 1, "b": 2},
                               2: {"a": 3, "b": 2},
                               3: {"a": 3, "b": 3}})
        self.assertTrue(dfa0.is_word_in(""))
        self.assertTrue(dfa0.is_word_in("aaaabbb"))
        self.assertFalse(dfa0.is_word_in("aaabaaaabbbbbb"))

        # dfa with the language immediately after every "a" there is a "b"
        dfa1 = DFA(1, {1}, {1: {"a": 2, "b": 1, "c": 1},
                            2: {"a": 3, "b": 1, "c": 3},
                            3: {"a": 3, "b": 3, "c": 3}})
        self.assertTrue(dfa1.is_word_in("abccccbbbbcccabababccccc"))
        self.assertFalse(dfa1.is_word_in("abccccbbabbcccaabababaaaa"))

        dfa2 = DFA(1, {1, 4}, {1: {"a": 2, "b": 1, "c": 1},
                               2: {"a": 3, "b": 1, "c": 3},
                               3: {"a": 3, "b": 3, "c": 4},
                               4: {"a": 3, "b": 3, "c": 4}})

        # dfa with the language immediately after every "a" there is a "b"
        dfa3 = DFA(1, {1, 5}, {1: {"a": 2, "b": 5, "c": 5},
                               2: {"a": 3, "b": 1, "c": 3},
                               3: {"a": 4, "b": 4, "c": 4},
                               4: {"a": 3, "b": 3, "c": 3},
                               5: {"a": 2, "b": 1, "c": 1}})

        self.assertTrue(dfa1 == dfa1)
        self.assertTrue(dfa1 == dfa3)
        self.assertTrue(dfa1 != dfa2)
        self.assertTrue(dfa2.is_language_not_subset_of(dfa1) is not None)

        dfa_0_inter_2 = dfa_intersection(dfa2, dfa1)
        self.assertTrue(dfa_0_inter_2 == dfa3)
        self.assertTrue(dfa_0_inter_2.is_language_not_subset_of(dfa2) is None)
        self.assertTrue(dfa_0_inter_2.is_language_not_subset_of(dfa1) is None)