1 // See www.openfst.org for extensive documentation on this weighted
2 // finite-state transducer library.
4 #ifndef FST_SCRIPT_RMEPSILON_H_
5 #define FST_SCRIPT_RMEPSILON_H_
10 #include <fst/queue.h>
11 #include <fst/rmepsilon.h>
12 #include <fst/script/fst-class.h>
13 #include <fst/script/shortest-distance.h>
14 #include <fst/script/weight-class.h>
19 struct RmEpsilonOptions : public ShortestDistanceOptions {
21 const WeightClass &weight_threshold;
22 const int64 state_threshold;
24 RmEpsilonOptions(QueueType queue_type, bool connect,
25 const WeightClass &weight_threshold,
26 int64 state_threshold = kNoStateId, float delta = kDelta)
27 : ShortestDistanceOptions(queue_type, EPSILON_ARC_FILTER, kNoStateId,
30 weight_threshold(weight_threshold),
31 state_threshold(state_threshold) {}
36 // Code to implement switching on queue types.
38 template <class Arc, class Queue>
39 void RmEpsilon(MutableFst<Arc> *fst,
40 std::vector<typename Arc::Weight> *distance,
41 const RmEpsilonOptions &opts, Queue *queue) {
42 using Weight = typename Arc::Weight;
43 const fst::RmEpsilonOptions<Arc, Queue> ropts(
44 queue, opts.delta, opts.connect,
45 *opts.weight_threshold.GetWeight<Weight>(), opts.state_threshold);
46 RmEpsilon(fst, distance, ropts);
50 void RmEpsilon(MutableFst<Arc> *fst, const RmEpsilonOptions &opts) {
51 using StateId = typename Arc::StateId;
52 using Weight = typename Arc::Weight;
53 std::vector<Weight> distance;
54 switch (opts.queue_type) {
56 AutoQueue<StateId> queue(*fst, &distance, EpsilonArcFilter<Arc>());
57 RmEpsilon(fst, &distance, opts, &queue);
61 FifoQueue<StateId> queue;
62 RmEpsilon(fst, &distance, opts, &queue);
66 LifoQueue<StateId> queue;
67 RmEpsilon(fst, &distance, opts, &queue);
70 case SHORTEST_FIRST_QUEUE: {
71 NaturalShortestFirstQueue<StateId, Weight> queue(distance);
72 RmEpsilon(fst, &distance, opts, &queue);
75 case STATE_ORDER_QUEUE: {
76 StateOrderQueue<StateId> queue;
77 RmEpsilon(fst, &distance, opts, &queue);
80 case TOP_ORDER_QUEUE: {
81 TopOrderQueue<StateId> queue(*fst, EpsilonArcFilter<Arc>());
82 internal::RmEpsilon(fst, &distance, opts, &queue);
86 FSTERROR() << "RmEpsilon: Unknown queue type: " << opts.queue_type;
87 fst->SetProperties(kError, kError);
93 } // namespace internal
95 using RmEpsilonArgs = std::pair<MutableFstClass *, const RmEpsilonOptions &>;
98 void RmEpsilon(RmEpsilonArgs *args) {
99 MutableFst<Arc> *fst = std::get<0>(*args)->GetMutableFst<Arc>();
100 const auto &opts = std::get<1>(*args);
101 internal::RmEpsilon(fst, opts);
104 void RmEpsilon(MutableFstClass *fst, const RmEpsilonOptions &opts);
106 } // namespace script
109 #endif // FST_SCRIPT_RMEPSILON_H_