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
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
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)