20 #ifndef FST_STATESORT_H_ 21 #define FST_STATESORT_H_ 38 const std::vector<typename Arc::StateId> &order) {
39 using StateId =
typename Arc::StateId;
40 using Weight =
typename Arc::Weight;
42 FSTERROR() <<
"StateSort: Bad order vector size: " << order.size();
48 std::vector<bool> done(order.size(),
false);
49 std::vector<Arc> arcsa;
50 std::vector<Arc> arcsb;
54 auto s1 = siter.Value();
56 if (done[s1])
continue;
57 auto final1 = fst->
Final(s1);
58 auto final2 = Weight::Zero();
62 arcsa.push_back(aiter.Value());
64 for (; !done[s1]; s1 = s2, final1 = final2, std::swap(arcsa, arcsb)) {
67 final2 = fst->
Final(s2);
71 arcsb.push_back(aiter.Value());
76 for (
auto arc : arcsa) {
77 arc.nextstate = order[arc.nextstate];
88 #endif // FST_STATESORT_H_ constexpr uint64_t kStateSortProperties
virtual uint64_t Properties(uint64_t mask, bool test) const =0
constexpr uint64_t kError
virtual Weight Final(StateId) const =0
virtual void SetStart(StateId)=0
virtual void SetProperties(uint64_t props, uint64_t mask)=0
virtual void DeleteArcs(StateId, size_t)=0
virtual StateId Start() const =0
constexpr uint64_t kFstProperties
virtual void AddArc(StateId, const Arc &)=0
virtual void SetFinal(StateId s, Weight weight=Weight::One())=0
virtual StateId NumStates() const =0
bool StateSort(std::vector< IntervalSet< Label >> *interval_sets, const std::vector< StateId > &order)