def rpni(self, pos_examples, neg_examples): dfa = DFA.from_word_list(pos_examples, self.alphabet) self.reds = {dfa.start} self.blues = { next_state for token, next_state in dfa.transitions[dfa.start].items() } self.draw(dfa=dfa, operation='pta') while len(self.blues) > 0: temp_dfa = 0 blue = choose(dfa, self.blues) for red in list(self.reds): temp_dfa = self.rpni_merge(deepcopy(dfa), red, blue) if rpni_compatible(temp_dfa, neg_examples): # print('compatible') break temp_dfa = 0 if temp_dfa != 0: if blue in self.blues: self.blues.remove(blue) dfa = temp_dfa for r_state in self.reds: for token, next_state in dfa.transitions[r_state].items(): if next_state not in self.reds: self.blues.add(next_state) self.draw(dfa=dfa, operation='merge') else: self.rpni_promote(dfa, blue) self.draw(dfa=dfa, operation='promoted') return dfa
def learn_dfa(teacher, num_examples): for i in range(num_examples): teacher.example() examples = teacher.used_examples pos_examples = [ex[0] for ex in examples if ex[1] == '+'] neg_examples = [ex[0] for ex in examples if ex[1] == '-'] pta = DFA.from_word_list(pos_examples, alphabet) return pta