20 #ifndef FST_STATESORT_H_ 21 #define FST_STATESORT_H_ 40 const std::vector<typename Arc::StateId> &order) {
41 using StateId =
typename Arc::StateId;
42 using Weight =
typename Arc::Weight;
44 FSTERROR() <<
"StateSort: Bad order vector size: " << order.size();
50 std::vector<bool> done(order.size(),
false);
51 std::vector<Arc> arcsa;
52 std::vector<Arc> arcsb;
56 auto s1 = siter.Value();
58 if (done[s1])
continue;
59 auto final1 = fst->
Final(s1);
60 auto final2 = Weight::Zero();
64 arcsa.push_back(aiter.Value());
66 for (; !done[s1]; s1 = s2, final1 = final2, std::swap(arcsa, arcsb)) {
69 final2 = fst->
Final(s2);
73 arcsb.push_back(aiter.Value());
78 for (
auto arc : arcsa) {
79 arc.nextstate = order[arc.nextstate];
90 #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)