1 // See www.openfst.org for extensive documentation on this weighted
2 // finite-state transducer library.
4 #ifndef FST_SCRIPT_MAP_H_
5 #define FST_SCRIPT_MAP_H_
10 #include <fst/arc-map.h>
11 #include <fst/state-map.h>
12 #include <fst/script/arg-packs.h>
13 #include <fst/script/fst-class.h>
14 #include <fst/script/weight-class.h>
20 Fst<typename M::ToArc> *ArcMap(const Fst<typename M::FromArc> &fst,
22 using ToArc = typename M::ToArc;
23 auto *ofst = new VectorFst<ToArc>;
24 ArcMap(fst, ofst, mapper);
29 Fst<typename M::ToArc> *StateMap(const Fst<typename M::FromArc> &fst,
31 using ToArc = typename M::ToArc;
32 auto *ofst = new VectorFst<ToArc>;
33 StateMap(fst, ofst, mapper);
43 OUTPUT_EPSILON_MAPPER,
54 using MapInnerArgs = std::tuple<const FstClass &, MapType, float,
57 using MapArgs = WithReturnValue<FstClass *, MapInnerArgs>;
60 void Map(MapArgs *args) {
61 using Weight = typename Arc::Weight;
62 const Fst<Arc> &ifst = *(std::get<0>(args->args).GetFst<Arc>());
63 const auto map_type = std::get<1>(args->args);
64 const auto weight = *(std::get<3>(args->args).GetWeight<Weight>());
66 case ARC_SUM_MAPPER: {
67 std::unique_ptr<Fst<Arc>> ofst(StateMap(ifst, ArcSumMapper<Arc>(ifst)));
68 args->retval = new FstClass(*ofst);
71 case ARC_UNIQUE_MAPPER: {
72 std::unique_ptr<Fst<Arc>> ofst(StateMap(ifst,
73 ArcUniqueMapper<Arc>(ifst)));
74 args->retval = new FstClass(*ofst);
77 case IDENTITY_MAPPER: {
78 std::unique_ptr<Fst<Arc>> ofst(ArcMap(ifst, IdentityArcMapper<Arc>()));
79 args->retval = new FstClass(*ofst);
82 case INPUT_EPSILON_MAPPER: {
83 std::unique_ptr<Fst<Arc>> ofst(ArcMap(ifst, InputEpsilonMapper<Arc>()));
84 args->retval = new FstClass(*ofst);
88 std::unique_ptr<Fst<Arc>> ofst(ArcMap(ifst, InvertWeightMapper<Arc>()));
89 args->retval = new FstClass(*ofst);
92 case OUTPUT_EPSILON_MAPPER: {
93 std::unique_ptr<Fst<Arc>> ofst(ArcMap(ifst, OutputEpsilonMapper<Arc>()));
94 args->retval = new FstClass(*ofst);
98 std::unique_ptr<Fst<Arc>> ofst(ArcMap(ifst, PlusMapper<Arc>(weight)));
99 args->retval = new FstClass(*ofst);
102 case QUANTIZE_MAPPER: {
103 std::unique_ptr<Fst<Arc>> ofst(ArcMap(ifst, QuantizeMapper<Arc>(
104 std::get<2>(args->args))));
105 args->retval = new FstClass(*ofst);
108 case RMWEIGHT_MAPPER: {
109 std::unique_ptr<Fst<Arc>> ofst(ArcMap(ifst, RmWeightMapper<Arc>()));
110 args->retval = new FstClass(*ofst);
113 case SUPERFINAL_MAPPER: {
114 std::unique_ptr<Fst<Arc>> ofst(ArcMap(ifst, SuperFinalMapper<Arc>()));
115 args->retval = new FstClass(*ofst);
119 std::unique_ptr<Fst<Arc>> ofst(ArcMap(ifst, TimesMapper<Arc>(weight)));
120 args->retval = new FstClass(*ofst);
123 case TO_LOG_MAPPER: {
124 std::unique_ptr<Fst<LogArc>> ofst(ArcMap(ifst,
125 WeightConvertMapper<Arc, LogArc>()));
126 args->retval = new FstClass(*ofst);
129 case TO_LOG64_MAPPER: {
130 std::unique_ptr<Fst<Log64Arc>> ofst(ArcMap(ifst,
131 WeightConvertMapper<Arc, Log64Arc>()));
132 args->retval = new FstClass(*ofst);
135 case TO_STD_MAPPER: {
136 std::unique_ptr<Fst<StdArc>> ofst(ArcMap(ifst,
137 WeightConvertMapper<Arc, StdArc>()));
138 args->retval = new FstClass(*ofst);
144 FstClass *Map(const FstClass &ifst, MapType map_type, float delta,
145 const WeightClass &weight);
147 } // namespace script
150 #endif // FST_SCRIPT_MAP_H_