20 #ifndef FST_RMFINALEPSILON_H_ 21 #define FST_RMFINALEPSILON_H_ 30 #include <unordered_set> 37 using StateId =
typename Arc::StateId;
38 using Weight =
typename Arc::Weight;
40 std::vector<bool> access;
41 std::vector<bool> coaccess;
48 std::unordered_set<StateId> finals;
50 const auto s = siter.Value();
51 if (fst->
Final(s) != Weight::Zero()) {
52 bool future_coaccess =
false;
54 const auto &arc = aiter.Value();
55 if (coaccess[arc.nextstate]) {
56 future_coaccess =
true;
60 if (!future_coaccess) finals.insert(s);
64 std::vector<Arc> arcs;
66 const auto s = siter.Value();
67 auto weight = fst->
Final(s);
70 const auto &arc = aiter.Value();
72 if (finals.find(arc.nextstate) != finals.end()) {
74 if (arc.ilabel == 0 && arc.olabel == 0) {
75 weight =
Plus(
Times(fst->
Final(arc.nextstate), arc.weight), weight);
85 if (arcs.size() < fst->
NumArcs(s)) {
88 for (
const auto &arc : arcs) fst->
AddArc(s, arc);
96 #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