20 #ifndef FST_CONNECT_H_ 21 #define FST_CONNECT_H_ 48 using StateId =
typename Arc::StateId;
49 std::vector<bool> access;
50 std::vector<bool> coaccess;
54 std::vector<StateId> dstates;
55 dstates.reserve(access.size());
56 for (StateId s = 0; s < access.size(); ++s) {
57 if (!access[s] || !coaccess[s]) dstates.push_back(s);
68 std::vector<typename Arc::StateId> *scc) {
69 using StateId =
typename Arc::StateId;
74 const auto iter = std::max_element(scc->cbegin(), scc->cend());
75 if (iter == scc->cend())
return;
76 const StateId num_condensed_states = 1 + *iter;
78 for (StateId c = 0; c < num_condensed_states; ++c) {
81 for (StateId s = 0; s < scc->size(); ++s) {
82 const auto c = (*scc)[s];
84 const auto weight = ifst.
Final(s);
85 if (weight != Arc::Weight::Zero())
88 const auto &arc = aiter.Value();
89 const auto nextc = (*scc)[arc.nextstate];
91 Arc condensed_arc = arc;
92 condensed_arc.nextstate = nextc;
93 ofst->
AddArc(c, std::move(condensed_arc));
102 #endif // FST_CONNECT_H_
ErrorWeight Plus(const ErrorWeight &, const ErrorWeight &)
constexpr uint64_t kCoAccessible
void DfsVisit(const FST &fst, Visitor *visitor, ArcFilter filter, bool access_only=false)
constexpr uint64_t kInitialAcyclic
virtual Weight Final(StateId) const =0
virtual void SetStart(StateId)=0
void Connect(MutableFst< Arc > *fst)
constexpr uint64_t kAcyclic
virtual void SetProperties(uint64_t props, uint64_t mask)=0
constexpr uint64_t kAccessible
virtual StateId Start() const =0
virtual void AddArc(StateId, const Arc &)=0
void Condense(const Fst< Arc > &ifst, MutableFst< Arc > *ofst, std::vector< typename Arc::StateId > *scc)
virtual StateId AddState()=0
virtual void ReserveStates(size_t)
virtual void SetFinal(StateId s, Weight weight=Weight::One())=0
virtual void DeleteStates(const std::vector< StateId > &)=0