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
26namespace fst {
27namespace script {
28
29template <class M>
30Fst<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
38template <class M>
39Fst<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
47enum 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
51typedef args::Package<const FstClass&, MapType, float,
52                      const WeightClass &> MapInnerArgs;
53typedef args::WithReturnValue<FstClass*, MapInnerArgs> MapArgs;
54
55template <class Arc>
56void 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
116FstClass *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