def from_openfst(cls, s: str, acceptor: bool = True) -> 'Fsa': '''Create an Fsa from a string in OpenFST format. The given string `s` consists of lines with the following format: (1) When it represents an acceptor: src_state dest_state label score (2) When it represents a transducer: src_state dest_state label aux_label score The line for the final state consists of two fields: final_state score Note: Fields are separated by space(s), tab(s) or both. The `score` field is a float, while other fields are integers. There might be multiple final states. Also, OpenFst may omit the score if it is 0.0. Args: s: The input string. Refer to the above comment for its format. acceptor: Optional. If true, interpret the input string as an acceptor; otherwise, interpret it as a transducer. ''' arcs, aux_labels = _fsa_from_str(s, acceptor, True) return Fsa(arcs, aux_labels=aux_labels)
def from_str(cls, s: str) -> 'Fsa': '''Create an Fsa from a string in the k2 format. (See also from_openfst). The given string `s` consists of lines with the following format: (1) When it represents an acceptor: src_state dest_state label score (2) When it represents a transducer: src_state dest_state label aux_label score The line for the final state consists of only one field: final_state Note: Fields are separated by space(s), tab(s) or both. The `score` field is a float, while other fields are integers. Caution: The first column has to be non-decreasing. Caution: The final state has the largest state number. There is only one final state. All arcs that are connected to the final state have label -1. Args: s: The input string. Refer to the above comment for its format. ''' # Figure out acceptor/transducer for k2 fsa. acceptor = True line = s.strip().split('\n', 1)[0] fields = line.strip().split() assert len(fields) == 4 or len(fields) == 5 if len(fields) == 5: acceptor = False ans = cls.__new__(cls) super(Fsa, ans).__init__() ans._init_internal() arcs, aux_labels = _fsa_from_str(s, acceptor, False) ans.arcs = arcs ans._init_properties() ans._tensor_attr['scores'] = _as_float(ans.arcs.values()[:, -1]) if aux_labels is not None: ans.aux_labels = aux_labels.to(torch.int32) return ans
def from_str(cls, s: str): '''Create an Fsa from a string. The given string `s` consists of lines with the following format: (1) When it represents an acceptor: src_state dest_state label score (2) When it represents a transducer: src_state dest_state label aux_label score The line for the final state consists of only one field: final_state Note: Fields are separated by space(s), tab(s) or both. The `score` field is a float, while other fields are integers. Caution: The first column has to be non-decreasing. Caution: The final state has the largest state number. There is only one final state. All arcs that are connected to the final state have label -1. Args: s: The input string. Refer to the above comment for its format. ''' # Figure out acceptor/transducer for k2 fsa. acceptor = True line = s.strip().split('\n', 1)[0] fields = line.strip().split() assert len(fields) == 4 or len(fields) == 5 if len(fields) == 5: acceptor = False ans = cls.__new__(cls) super(Fsa, ans).__init__() fsa, aux_labels = _fsa_from_str(s, acceptor, False) ans._fsa = fsa ans._aux_labels = aux_labels return ans
def __init__(self, s: str, negate_scores: bool = False): '''Create an Fsa from a string. The given string `s` consists of lines with the following format: (1) When it represents an acceptor: src_state dest_state label score (2) When it represents a transducer: src_state dest_state label aux_label score The line for the final state consists of only one field: final_state Note: Fields are separated by space(s), tab(s) or both. The `score` field is a float, while other fields are integers. Caution: The first column has to be non-decreasing. Caution: The final state has the largest state number. There is only one final state. All arcs that are connected to the final state have label -1. Args: s: The input string. Refer to the above comment for its format. negate_scores: Optional. If true, the string form has the weights as costs, not scores, so we negate as we read. ''' fsa: _Fsa aux_labels: Optional[torch.Tensor] fsa, aux_labels = _fsa_from_str(s, negate_scores) self._fsa = fsa self._aux_labels = aux_labels
def from_openfst(cls, s: str, acceptor: bool = True) -> 'Fsa': '''Create an Fsa from a string in OpenFST format. The given string `s` consists of lines with the following format: (1) When it represents an acceptor: src_state dest_state label score (2) When it represents a transducer: src_state dest_state label aux_label score The line for the final state consists of two fields: final_state score Note: Fields are separated by space(s), tab(s) or both. The `score` field is a float, while other fields are integers. There might be multiple final states. Also, OpenFst may omit the score if it is 0.0. Args: s: The input string. Refer to the above comment for its format. acceptor: Optional. If true, interpret the input string as an acceptor; otherwise, interpret it as a transducer. ''' ans = cls.__new__(cls) super(Fsa, ans).__init__() ans._init_internal() arcs, aux_labels = _fsa_from_str(s, acceptor, True) ans.arcs = arcs ans._init_properties() ans._tensor_attr['scores'] = _as_float(ans.arcs.values()[:, -1]) if aux_labels is not None: ans.aux_labels = aux_labels.to(torch.int32) return ans