def top_sort(fsa: Fsa) -> Fsa: '''Sort an FSA topologically. Note: It returns a new FSA. The input FSA is NOT changed. Args: fsa: The input FSA to be sorted. It can be either a single FSA or a vector of FSAs. Returns: It returns a single FSA if the input is a single FSA; it returns a vector of FSAs if the input is a vector of FSAs. ''' need_arc_map = True ragged_arc, arc_map = _k2.top_sort(fsa.arcs, need_arc_map=need_arc_map) arc_map = arc_map.to(torch.int64) # required by index_select sorted_fsa = Fsa.from_ragged_arc(ragged_arc) for name, value in fsa.named_tensor_attr(): setattr(sorted_fsa, name, value.index_select(0, arc_map)) for name, value in fsa.named_non_tensor_attr(): setattr(sorted_fsa, name, value) # Delete the properties. Users should set it explicitly if hasattr(sorted_fsa, 'properties'): del sorted_fsa.properties return sorted_fsa
def top_sort(fsa: Fsa) -> Fsa: '''Sort an FSA topologically. Note: It returns a new FSA. The input FSA is NOT changed. Args: fsa: The input FSA to be sorted. It can be either a single FSA or a vector of FSAs. Returns: It returns a single FSA if the input is a single FSA; it returns a vector of FSAs if the input is a vector of FSAs. ''' need_arc_map = True ragged_arc, arc_map = _k2.top_sort(fsa.arcs, need_arc_map=need_arc_map) out_fsa = k2.utils.fsa_from_unary_function_tensor(fsa, ragged_arc, arc_map) return out_fsa
def top_sort(fsa: Fsa) -> Fsa: '''Sort an FSA topologically. Note: It returns a new FSA. The input FSA is NOT changed. Args: fsa: The input FSA to be sorted. It can be either a single FSA or a vector of FSAs. Returns: It returns a single FSA if the input is a single FSA; it returns a vector of FSAs if the input is a vector of FSAs. ''' need_arc_map = True ragged_arc, arc_map = _k2.top_sort(fsa.arcs, need_arc_map=need_arc_map) sorted_fsa = Fsa(ragged_arc) for name, value in fsa.named_tensor_attr(): setattr(sorted_fsa, name, index_attr(value, arc_map)) for name, value in fsa.named_non_tensor_attr(): setattr(sorted_fsa, name, value) return sorted_fsa