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