20 #ifndef FST_RMFINALEPSILON_H_ 21 #define FST_RMFINALEPSILON_H_ 31 #include <unordered_set> 38 using StateId =
typename Arc::StateId;
39 using Weight =
typename Arc::Weight;
41 std::vector<bool> access;
42 std::vector<bool> coaccess;
49 std::unordered_set<StateId> finals;
51 const auto s = siter.Value();
52 if (fst->
Final(s) != Weight::Zero()) {
53 bool future_coaccess =
false;
55 const auto &arc = aiter.Value();
56 if (coaccess[arc.nextstate]) {
57 future_coaccess =
true;
61 if (!future_coaccess) finals.insert(s);
65 std::vector<Arc> arcs;
67 const auto s = siter.Value();
68 auto weight = fst->
Final(s);
71 const auto &arc = aiter.Value();
73 if (finals.find(arc.nextstate) != finals.end()) {
75 if (arc.ilabel == 0 && arc.olabel == 0) {
76 weight =
Plus(
Times(fst->
Final(arc.nextstate), arc.weight), weight);
86 if (arcs.size() < fst->
NumArcs(s)) {
89 for (
const auto &arc : arcs) fst->
AddArc(s, arc);
97 #endif // FST_RMFINALEPSILON_H_
ErrorWeight Plus(const ErrorWeight &, const ErrorWeight &)
virtual size_t NumArcs(StateId) const =0
ErrorWeight Times(const ErrorWeight &, const ErrorWeight &)
void DfsVisit(const FST &fst, Visitor *visitor, ArcFilter filter, bool access_only=false)
void RmFinalEpsilon(MutableFst< Arc > *fst)
virtual Weight Final(StateId) const =0
void Connect(MutableFst< Arc > *fst)
virtual void DeleteArcs(StateId, size_t)=0
virtual void AddArc(StateId, const Arc &)=0
virtual void SetFinal(StateId s, Weight weight=Weight::One())=0