// See www.openfst.org for extensive documentation on this weighted // finite-state transducer library. // // Function that implements epsilon-normalization. #ifndef FST_EPSNORMALIZE_H_ #define FST_EPSNORMALIZE_H_ #include #include #include #include namespace fst { enum EpsNormalizeType { EPS_NORM_INPUT, EPS_NORM_OUTPUT }; // Returns an equivalent FST that is epsilon-normalized. An acceptor is // epsilon-normalized if it is epsilon-removed. A transducer is input // epsilon-normalized if additionally if on each path any epsilon input // label follows all non-epsilon input labels. Output epsilon-normalized // is defined similarly. // // For more information, see: // // Mohri, M. 2002. Generic epsilon-removal and input epsilon-normalization // algorithms for weighted transducers. International Journal of Computer // Science, 13(1): 129-143, 2002. template void EpsNormalize(const Fst &ifst, MutableFst *ofst, EpsNormalizeType type = EPS_NORM_INPUT) { EpsNormalize(ifst, ofst, type); } // Same as above, expect allows specifying explicitely the gallic weight type. template void EpsNormalize(const Fst &ifst, MutableFst *ofst, EpsNormalizeType type) { VectorFst> gfst; if (type == EPS_NORM_INPUT) { ArcMap(ifst, &gfst, ToGallicMapper()); } else { // type == EPS_NORM_OUTPUT ArcMap(InvertFst(ifst), &gfst, ToGallicMapper()); } RmEpsilon(&gfst); FactorWeightFst, GallicFactor> fwfst(gfst); ArcMap(fwfst, ofst, FromGallicMapper()); ofst->SetOutputSymbols(ifst.OutputSymbols()); if (type == EPS_NORM_OUTPUT) Invert(ofst); } } // namespace fst #endif // FST_EPSNORMALIZE_H_