def test_transducer_equality(self): feature_table = FeatureTable.load(get_feature_table_fixture("a_b_and_cons_feature_table.json")) faith = FaithConstraint([],feature_table).get_transducer() phonotactic = PhonotacticConstraint([{'cons': '+'}], feature_table).get_transducer() max = MaxConstraint([{'cons': '+'}], feature_table).get_transducer() transducer1 = Transducer.intersection(faith, phonotactic, max) temp_transducer = Transducer.intersection(phonotactic, max) transducer2 = Transducer.intersection(faith, temp_transducer) self.assertEqual(transducer1, transducer2)
def make_optimal_paths(transducer_input): transducer = pickle.loads(pickle.dumps(transducer_input, -1)) alphabet = transducer.get_alphabet() new_arcs = list() for segment in alphabet: word = Word(segment.get_symbol()) word_transducer = word.get_transducer() #print(word_transducer.dot_representation()) intersected_machine = Transducer.intersection(word_transducer, transducer) states = transducer.get_states() for state1, state2 in itertools.product(states, states): initial_state = word_transducer.initial_state & state1 final_state = word_transducer.get_a_final_state() & state2 temp_transducer = pickle.loads(pickle.dumps(intersected_machine, -1)) temp_transducer.initial_state = initial_state temp_transducer.set_final_state(final_state) temp_transducer.clear_dead_states() if final_state in temp_transducer.get_final_states(): # otherwise no path. try: temp_transducer = remove_suboptimal_paths(temp_transducer) range = temp_transducer.get_range() arc = Arc(state1, segment, range, _get_path_cost(temp_transducer), state2) new_arcs.append(arc) except KeyError: pass #print("****") #print(temp_transducer.dot_representation()) transducer.set_arcs(new_arcs) return transducer
def setUp(self): self.feature_table = FeatureTable.load(get_feature_table_fixture("feature_table.json")) self.phonotactic_test_feature_table = FeatureTable.load(get_feature_table_fixture( "phonotactic_test_feature_table.json")) self.transducer = Transducer(self.feature_table.get_segments()) self.state1 = State('q1') self.state2 = State('q2') self.transducer.add_state(self.state1) self.transducer.add_state(self.state2) self.transducer.initial_state = self.state1 self.transducer.add_final_state(self.state2) self.cost_vector1 = CostVector([3, 1, 0]) self.cost_vector2 = CostVector([2, 0, 0]) self.arc = Arc(self.state1, Segment('a', self.feature_table), Segment('b', self.feature_table), CostVector([0, 1, 0]), self.state2) self.transducer.add_arc(self.arc) self.simple_transducer = self.transducer self.loops_transducer = deepcopy(self.transducer) zero_cost_vector = CostVector([0]) segment_a = Segment('a', self.feature_table) segment_b = Segment('b', self.feature_table) self.loops_transducer.add_arc(Arc(self.state1, JOKER_SEGMENT, segment_a, zero_cost_vector, self.state1)) self.loops_transducer.add_arc(Arc(self.state1, JOKER_SEGMENT, segment_b, zero_cost_vector,self.state1)) self.loops_transducer.add_arc(Arc(self.state2, NULL_SEGMENT, segment_a, zero_cost_vector,self.state2)) self.loops_transducer.add_arc(Arc(self.state2, NULL_SEGMENT, segment_b, zero_cost_vector,self.state2)) phonotactic = PhonotacticConstraint([{'cons': '+'}, {'voice': '+'}, {'labial': '+'}], self.phonotactic_test_feature_table).get_transducer() dep = DepConstraint([{'labial': '-'}], self.phonotactic_test_feature_table).get_transducer() max = MaxConstraint([{'voice': '-'}], self.phonotactic_test_feature_table).get_transducer() self.intersection_test_transducer = Transducer.intersection(phonotactic, dep, max)
def _get_outputs(self, word): grammar_transducer = self.get_transducer() word_transducer = word.get_transducer() write_to_dot(grammar_transducer, "grammar_transducer") write_to_dot(word_transducer, "word_transducer") intersected_transducer = Transducer.intersection(word_transducer, # a transducer with NULLs on inputs and JOKERs on outputs grammar_transducer) # a transducer with segments on inputs and sets on outputs intersected_transducer.clear_dead_states() intersected_transducer = optimize_transducer_grammar_for_word(word, intersected_transducer) outputs = intersected_transducer.get_range() return outputs
def _get_outputs(self, word): grammar_transducer = self.get_transducer() word_transducer = word.get_transducer() intersected_transducer = Transducer.intersection( word_transducer, # a transducer with NULLs on inputs and JOKERs on outputs grammar_transducer ) # a transducer with segments on inputs and sets on outputs intersected_transducer.clear_dead_states() intersected_transducer = optimize_transducer_grammar_for_word( word, intersected_transducer) #dot(intersected_transducer, 'intersected') outputs = intersected_transducer.get_range() return outputs
def _make_transducer(self): if len(self.constraints) is 1: # if there is only on constraint in the return pickle.loads(pickle.dumps(self.constraints[0].get_transducer(), -1)) # constraint set there is no need to intersect else: constraints_transducers = [constraint.get_transducer() for constraint in self.constraints] return Transducer.intersection(*constraints_transducers)