def determinize(fsa: Fsa) -> Fsa: '''Determinize the input Fsa. Caution: It only works on for CPU and doesn't support autograd. Args: fsa: The input FSA. It can be either a single FSA or an FsaVec. Must be connected. It's also expected to be epsilon-free, but this is not checked; in any case, epsilon will be treated as a normal symbol. Returns: The result Fsa, it's equivalent to the input ``fsa`` under tropical semiring but will be deterministic. It will be the same as the input ``fsa`` if the input ``fsa`` has property kFsaPropertiesArcSortedAndDeterministic. Otherwise, a new deterministic fsa is returned and the input ``fsa`` is NOT modified. ''' properties = getattr(fsa, 'properties', None) if properties is not None \ and properties & fsa_properties.ARC_SORTED_AND_DETERMINISTIC != 0: # noqa return fsa ragged_arc, arc_derivs = _k2.determinize(fsa.arcs) aux_labels = None if hasattr(fsa, 'aux_labels'): aux_labels = _k2.simple_ragged_index_select(fsa.aux_labels, arc_derivs) out_fsa = Fsa(ragged_arc, aux_labels) for name, value in fsa.named_non_tensor_attr(): setattr(out_fsa, name, value) return out_fsa
def determinize(fsa: Fsa) -> Fsa: '''Determinize the input Fsa. Caution: It only works on for CPU. Args: fsa: The input FSA. It can be either a single FSA or an FsaVec. Must be connected. It's also expected to be epsilon-free, but this is not checked; in any case, epsilon will be treated as a normal symbol. Returns: The resulting Fsa, it's equivalent to the input `fsa` under tropical semiring but will be deterministic. It will be the same as the input `fsa` if the input `fsa` has property kFsaPropertiesArcSortedAndDeterministic. Otherwise, a new deterministic fsa is returned and the input `fsa` is NOT modified. ''' assert fsa.is_cpu() assert fsa.requires_grad is False if fsa.properties & fsa_properties.ARC_SORTED_AND_DETERMINISTIC != 0: # noqa return fsa ragged_arc, arc_map = _k2.determinize(fsa.arcs) out_fsa = k2.utils.fsa_from_unary_function_ragged(fsa, ragged_arc, arc_map) return out_fsa
def determinize( fsa: Fsa, weight_pushing_type: _k2.DeterminizeWeightPushingType = _k2. DeterminizeWeightPushingType.kNoWeightPushing ) -> Fsa: '''Determinize the input Fsa. Caution: - It only works on for CPU. - Any weight_pushing_type value other than kNoWeightPushing causes the 'arc_derivs' to not accurately reflect the real derivatives, although this will not matter as long as the derivatives ultimately derive from FSA operations such as getting total scores or arc posteriors, which are insensitive to pushing. Args: fsa: The input FSA. It can be either a single FSA or an FsaVec. Must be connected. It's also expected to be epsilon-free, but this is not checked; in any case, epsilon will be treated as a normal symbol. weight_pushing_type: An enum value that determines what kind of weight pushing is desired, default kNoWeightPushing. kTropicalWeightPushing: use tropical semiring (actually, max on scores) for weight pushing. kLogWeightPushing: use log semiring (actually, log-sum on score) for weight pushing kNoWeightPushing: do no weight pushing; this will cause some delay in scores being emitted, and the weights created in this way will correspond exactly to those that would be produced by the arc_derivs. For decoding graph creation, we recommend kLogSumWeightPushing. Returns: The resulting Fsa, it's equivalent to the input `fsa` under tropical semiring but will be deterministic. It will be the same as the input `fsa` if the input `fsa` has property kFsaPropertiesArcSortedAndDeterministic. Otherwise, a new deterministic fsa is returned and the input `fsa` is NOT modified. ''' assert fsa.is_cpu() assert fsa.requires_grad is False if fsa.properties & fsa_properties.ARC_SORTED_AND_DETERMINISTIC != 0: # noqa return fsa ragged_arc, arc_map = _k2.determinize(fsa.arcs, weight_pushing_type) out_fsa = k2.utils.fsa_from_unary_function_ragged(fsa, ragged_arc, arc_map) return out_fsa