예제 #1
0
    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
예제 #3
0
    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)
예제 #4
0
파일: grammar.py 프로젝트: taucompling/otml
    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
예제 #6
0
 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)
예제 #7
0
 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)