1 
2 // Licensed under the Apache License, Version 2.0 (the "License");
3 // you may not use this file except in compliance with the License.
4 // You may obtain a copy of the License at
5 //
6 //     http://www.apache.org/licenses/LICENSE-2.0
7 //
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13 //
14 // Copyright 2005-2010 Google, Inc.
15 // Author: jpr@google.com (Jake Ratkiewicz)
16 
17 #ifndef FST_SCRIPT_MAP_H_
18 #define FST_SCRIPT_MAP_H_
19 
20 #include <fst/script/arg-packs.h>
21 #include <fst/script/fst-class.h>
22 #include <fst/script/weight-class.h>
23 #include <fst/arc-map.h>
24 #include <fst/state-map.h>
25 
26 namespace fst {
27 namespace script {
28 
29 template <class M>
ArcMap(const Fst<typename M::FromArc> & fst,const M & mapper)30 Fst<typename M::ToArc> *ArcMap(const Fst<typename M::FromArc> &fst,
31                             const M &mapper) {
32   typedef typename M::ToArc ToArc;
33   VectorFst<ToArc> *ofst = new VectorFst<ToArc>;
34   ArcMap(fst, ofst, mapper);
35   return ofst;
36 }
37 
38 template <class M>
StateMap(const Fst<typename M::FromArc> & fst,const M & mapper)39 Fst<typename M::ToArc> *StateMap(const Fst<typename M::FromArc> &fst,
40                                  const M &mapper) {
41   typedef typename M::ToArc ToArc;
42   VectorFst<ToArc> *ofst = new VectorFst<ToArc>;
43   StateMap(fst, ofst, mapper);
44   return ofst;
45 }
46 
47 enum MapType { ARC_SUM_MAPPER, IDENTITY_MAPPER, INVERT_MAPPER, PLUS_MAPPER,
48                QUANTIZE_MAPPER, RMWEIGHT_MAPPER, SUPERFINAL_MAPPER,
49                TIMES_MAPPER, TO_LOG_MAPPER, TO_LOG64_MAPPER, TO_STD_MAPPER };
50 
51 typedef args::Package<const FstClass&, MapType, float,
52                       const WeightClass &> MapInnerArgs;
53 typedef args::WithReturnValue<FstClass*, MapInnerArgs> MapArgs;
54 
55 template <class Arc>
Map(MapArgs * args)56 void Map(MapArgs *args) {
57   const Fst<Arc> &ifst = *(args->args.arg1.GetFst<Arc>());
58   MapType map_type = args->args.arg2;
59   float delta =  args->args.arg3;
60   typename Arc::Weight w = *(args->args.arg4.GetWeight<typename Arc::Weight>());
61 
62   Fst<Arc> *fst = NULL;
63   Fst<LogArc> *lfst = NULL;
64   Fst<Log64Arc> *l64fst = NULL;
65   Fst<StdArc> *sfst = NULL;
66   if (map_type == ARC_SUM_MAPPER) {
67     args->retval = new FstClass(*(fst =
68         script::StateMap(ifst, ArcSumMapper<Arc>(ifst))));
69   } else if (map_type == IDENTITY_MAPPER) {
70     args->retval = new FstClass(*(fst =
71         script::ArcMap(ifst, IdentityArcMapper<Arc>())));
72   } else if (map_type == INVERT_MAPPER) {
73     args->retval = new FstClass(*(fst =
74         script::ArcMap(ifst, InvertWeightMapper<Arc>())));
75   } else if (map_type == PLUS_MAPPER) {
76     args->retval = new FstClass(*(fst =
77         script::ArcMap(ifst, PlusMapper<Arc>(w))));
78   } else if (map_type == QUANTIZE_MAPPER) {
79     args->retval = new FstClass(*(fst =
80         script::ArcMap(ifst, QuantizeMapper<Arc>(delta))));
81   } else if (map_type == RMWEIGHT_MAPPER) {
82     args->retval = new FstClass(*(fst =
83         script::ArcMap(ifst, RmWeightMapper<Arc>())));
84   } else if (map_type == SUPERFINAL_MAPPER) {
85     args->retval = new FstClass(*(fst =
86         script::ArcMap(ifst, SuperFinalMapper<Arc>())));
87   } else if (map_type == TIMES_MAPPER) {
88     args->retval = new FstClass(*(fst =
89         script::ArcMap(ifst, TimesMapper<Arc>(w))));
90   } else if (map_type == TO_LOG_MAPPER) {
91     args->retval = new FstClass(*(lfst =
92         script::ArcMap(ifst, WeightConvertMapper<Arc, LogArc>())));
93   } else if (map_type == TO_LOG64_MAPPER) {
94     args->retval = new FstClass(*(l64fst =
95         script::ArcMap(ifst, WeightConvertMapper<Arc, Log64Arc>())));
96   } else if (map_type == TO_STD_MAPPER) {
97     args->retval = new FstClass(*(sfst =
98         script::ArcMap(ifst, WeightConvertMapper<Arc, StdArc>())));
99   } else {
100     FSTERROR() << "Error: unknown/unsupported mapper type: "
101                << map_type;
102     VectorFst<Arc> *ofst = new VectorFst<Arc>;
103     ofst->SetProperties(kError, kError);
104     args->retval = new FstClass(*(fst =ofst));
105   }
106   delete sfst;
107   delete l64fst;
108   delete lfst;
109   delete fst;
110 }
111 
112 
113 #ifdef SWIG
114 %newobject Map;
115 #endif
116 FstClass *Map(const FstClass& f, MapType map_type,
117          float delta = fst::kDelta,
118          const WeightClass &w = fst::script::WeightClass::Zero());
119 
120 }  // namespace script
121 }  // namespace fst
122 
123 #endif  // FST_SCRIPT_MAP_H_
124