示例#1
0
 def test1(self):
     s = '''
         0 4 1 1
         0 1 1 1
         1 2 0 2
         1 3 0 3
         1 4 0 2
         2 7 0 4
         3 7 0 5
         4 6 1 2
         4 6 0 3
         4 8 1 3
         4 9 -1 2
         5 9 -1 4
         6 9 -1 3
         7 9 -1 5
         8 9 -1 6
         9
     '''
     fsa = k2.Fsa.from_str(s)
     prop = fsa.properties
     self.assertFalse(prop & k2.fsa_properties.EPSILON_FREE)
     dest = k2.remove_epsilon(fsa)
     prop = dest.properties
     self.assertTrue(prop & k2.fsa_properties.EPSILON_FREE)
     log_semiring = False
     self.assertTrue(k2.is_rand_equivalent(fsa, dest, log_semiring))
示例#2
0
    def test1(self):
        if not torch.cuda.is_available():
            return

        if not k2.with_cuda:
            return

        device = torch.device('cuda', 0)
        s = '''
            0 1 0 1 1
            1 2 0 2 1
            2 3 0 3 1
            3 4 4 4 1
            3 5 -1 5 1
            4 5 -1 6 1
            5
        '''
        fsa = k2.Fsa.from_str(s, aux_label_names=['foo']).to(device)
        filler = 2
        fsa.foo_filler = filler
        print("Before removing epsilons: ", fsa)
        prop = fsa.properties
        self.assertFalse(prop & k2.fsa_properties.EPSILON_FREE)
        dest = k2.remove_epsilon(fsa)
        prop = dest.properties
        self.assertTrue(prop & k2.fsa_properties.EPSILON_FREE)
        log_semiring = False
        self.assertTrue(k2.is_rand_equivalent(fsa, dest, log_semiring))

        print("After removing epsilons: ", dest)
        assert torch.where(dest.foo.values == filler)[0].numel() == 0
示例#3
0
 def test1(self):
     s = '''
         0 4 1 1
         0 1 1 1
         1 2 2 2
         1 3 3 3
         2 7 1 4
         3 7 1 5
         4 6 1 2
         4 6 1 3
         4 5 1 3
         4 8 -1 2
         5 8 -1 4
         6 8 -1 3
         7 8 -1 5
         8
     '''
     fsa = k2.Fsa.from_str(s)
     prop = fsa.properties
     self.assertFalse(
         prop & k2.fsa_properties.ARC_SORTED_AND_DETERMINISTIC != 0)
     dest = k2.determinize(fsa)
     log_semiring = False
     self.assertTrue(k2.is_rand_equivalent(fsa, dest, log_semiring))
     arc_sorted = k2.arc_sort(dest)
     prop = arc_sorted.properties
     self.assertTrue(
         prop & k2.fsa_properties.ARC_SORTED_AND_DETERMINISTIC != 0)
示例#4
0
    def test1(self):
        if not torch.cuda.is_available():
            return

        if not k2.with_cuda:
            return

        device = torch.device('cuda', 0)
        s = '''
            0 1 0 1 1
            1 2 0 2 1
            2 3 0 3 1
            3 4 4 4 1
            3 5 -1 5 1
            4 5 -1 6 1
            5
        '''
        fsa = k2.Fsa.from_str(s, num_aux_labels=1).to(device)
        print(fsa.aux_labels)
        prop = fsa.properties
        self.assertFalse(prop & k2.fsa_properties.EPSILON_FREE)
        dest = k2.remove_epsilon(fsa)
        prop = dest.properties
        self.assertTrue(prop & k2.fsa_properties.EPSILON_FREE)
        log_semiring = False
        self.assertTrue(k2.is_rand_equivalent(fsa, dest, log_semiring))

        # just make sure that it runs.
        dest2 = k2.remove_epsilon_and_add_self_loops(fsa)
        dest3 = k2.remove_epsilon(dest2)

        self.assertTrue(
            k2.is_rand_equivalent(dest,
                                  dest3,
                                  log_semiring,
                                  treat_epsilons_specially=False))
        self.assertFalse(
            k2.is_rand_equivalent(dest,
                                  dest2,
                                  log_semiring,
                                  treat_epsilons_specially=False,
                                  npath=10000))
        self.assertTrue(
            k2.is_rand_equivalent(dest,
                                  dest2,
                                  log_semiring,
                                  treat_epsilons_specially=True))
示例#5
0
 def test_random(self):
     while True:
         fsa = k2.random_fsa(max_symbol=20,
                             min_num_arcs=50,
                             max_num_arcs=500)
         fsa = k2.arc_sort(k2.connect(k2.remove_epsilon(fsa)))
         prob = fsa.properties
         # we need non-deterministic fsa
         if not prob & k2.fsa_properties.ARC_SORTED_AND_DETERMINISTIC:
             break
     log_semiring = False
     # test weight pushing tropical
     dest_max = k2.determinize(
         fsa, k2.DeterminizeWeightPushingType.kTropicalWeightPushing)
     self.assertTrue(
         k2.is_rand_equivalent(fsa, dest_max, log_semiring, delta=1e-3))
     # test weight pushing log
     dest_log = k2.determinize(
         fsa, k2.DeterminizeWeightPushingType.kLogWeightPushing)
     self.assertTrue(
         k2.is_rand_equivalent(fsa, dest_log, log_semiring, delta=1e-3))
示例#6
0
 def test_good_case_2(self):
     # same fsas
     s_a = r'''
     0 1 1
     0 2 2
     1 2 3
     1 3 4
     2 3 5
     3
     '''
     fsa_a = k2.str_to_fsa(s_a)
     self.assertTrue(k2.is_rand_equivalent(fsa_a, fsa_a))
示例#7
0
 def test1(self):
     s = '''
         0 4 1 1
         0 1 1 1
         1 2 2 2
         1 3 3 3
         2 7 1 4
         3 7 1 5
         4 6 1 2
         4 6 1 3
         4 5 1 3
         4 8 -1 2
         5 8 -1 4
         6 8 -1 3
         7 8 -1 5
         8
     '''
     fsa = k2.Fsa.from_str(s)
     prop = fsa.properties
     self.assertFalse(
         prop & k2.fsa_properties.ARC_SORTED_AND_DETERMINISTIC != 0)
     dest = k2.determinize(fsa)
     log_semiring = False
     self.assertTrue(k2.is_rand_equivalent(fsa, dest, log_semiring))
     arc_sorted = k2.arc_sort(dest)
     prop = arc_sorted.properties
     self.assertTrue(
         prop & k2.fsa_properties.ARC_SORTED_AND_DETERMINISTIC != 0)
     # test weight pushing tropical
     dest_max = k2.determinize(
         fsa, k2.DeterminizeWeightPushingType.kTropicalWeightPushing)
     self.assertTrue(k2.is_rand_equivalent(dest, dest_max, log_semiring))
     # test weight pushing log
     dest_log = k2.determinize(
         fsa, k2.DeterminizeWeightPushingType.kLogWeightPushing)
     self.assertTrue(k2.is_rand_equivalent(dest, dest_log, log_semiring))
示例#8
0
 def test_good_case_1(self):
     # both fsas will be empty after triming
     s_a = r'''
     0 1 1
     0 2 2
     1 2 3
     3
     '''
     fsa_a = k2.str_to_fsa(s_a)
     s_b = r'''
     0 1 1
     0 2 2
     3
     '''
     fsa_b = k2.str_to_fsa(s_b)
     self.assertTrue(k2.is_rand_equivalent(fsa_a, fsa_b))
示例#9
0
 def test_bad_case_1(self):
     s_a = r'''
     0 1 1
     0 2 2
     1 2 3
     1 3 4
     2 3 5
     3
     '''
     fsa_a = k2.str_to_fsa(s_a)
     s_b = r'''
     0 1 1
     0 2 2
     1 2 3
     3
     '''
     fsa_b = k2.str_to_fsa(s_b)
     self.assertFalse(k2.is_rand_equivalent(fsa_a, fsa_b))
示例#10
0
 def test1(self):
     s = '''
         0 1 0 1 1
         1 2 0 2 1
         2 3 0 3 1
         3 4 4 4 1
         3 5 -1 5 1
         4 5 -1 6 1
         5
     '''
     fsa = k2.Fsa.from_str(s)
     print(fsa.aux_labels)
     prop = fsa.properties
     self.assertFalse(prop & k2.fsa_properties.EPSILON_FREE)
     dest = k2.remove_epsilons_iterative_tropical(fsa)
     prop = dest.properties
     self.assertTrue(prop & k2.fsa_properties.EPSILON_FREE)
     log_semiring = False
     self.assertTrue(k2.is_rand_equivalent(fsa, dest, log_semiring))
示例#11
0
 def test_bad_case_2(self):
     s_a = r'''
     0 1 1
     0 2 2
     0 3 8
     1 4 4
     2 4 5
     4
     '''
     fsa_a = k2.str_to_fsa(s_a)
     s_b = r'''
     0 2 1
     0 1 2
     0 3 9
     1 4 5
     2 4 4
     4
     '''
     fsa_b = k2.str_to_fsa(s_b)
     self.assertTrue(k2.is_rand_equivalent(fsa_a, fsa_b))
示例#12
0
    def test_composition_equivalence(self):
        index = _generate_fsa_vec()
        index = k2.arc_sort(k2.connect(k2.remove_epsilon(index)))

        src = _generate_fsa_vec()

        replace = k2.replace_fsa(src, index, 1)
        replace = k2.top_sort(replace)

        f_fsa = _construct_f(src)
        f_fsa = k2.arc_sort(f_fsa)
        intersect = k2.intersect(index, f_fsa, treat_epsilons_specially=True)
        intersect = k2.invert(intersect)
        intersect = k2.top_sort(intersect)
        delattr(intersect, 'aux_labels')

        assert k2.is_rand_equivalent(replace,
                                     intersect,
                                     log_semiring=True,
                                     delta=1e-3)