// Copyright 2005-2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the 'License'); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an 'AS IS' BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // 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 #include #include #include #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, except allows specifying explicitly the gallic weight type. template void EpsNormalize(const Fst &ifst, MutableFst *ofst, EpsNormalizeType type) { VectorFst> gfst; std::unique_ptr symbols; if (type == EPS_NORM_INPUT) { ArcMap(ifst, &gfst, ToGallicMapper()); if (ifst.OutputSymbols()) symbols.reset(ifst.OutputSymbols()->Copy()); } else { // type == EPS_NORM_OUTPUT ArcMap(InvertFst(ifst), &gfst, ToGallicMapper()); if (ifst.InputSymbols()) symbols.reset(ifst.InputSymbols()->Copy()); } RmEpsilon(&gfst); FactorWeightFst, GallicFactor> fwfst(gfst); ArcMap(fwfst, ofst, FromGallicMapper()); ofst->SetOutputSymbols(symbols.get()); if (type == EPS_NORM_OUTPUT) Invert(ofst); } } // namespace fst #endif // FST_EPSNORMALIZE_H_