20 #ifndef FST_SYNCHRONIZE_H_ 21 #define FST_SYNCHRONIZE_H_ 28 #include <string_view> 34 #include <unordered_map> 35 #include <unordered_set> 49 using Label =
typename Arc::Label;
66 using String = std::basic_string<Label>;
101 auto start = fst_->Start();
112 const auto &element = elements_[s];
113 const auto weight = element.state ==
kNoStateId 115 : fst_->Final(element.state);
116 if ((weight != Weight::Zero()) && element.istring.empty() &&
117 element.ostring.empty()) {
145 if ((mask &
kError) && fst_->Properties(kError,
false)) {
170 return Concat(str.substr(1), label);
176 if (label) r.push_back(label);
190 const auto [str_it, unused] = string_set_.insert(std::forward<String>(str));
197 const auto &[iter, inserted] =
198 element_map_.emplace(element, elements_.size());
200 elements_.push_back(element);
208 const auto element = elements_[s];
212 const auto &arc = aiter.Value();
213 if (!
Empty(element.istring, arc.ilabel) &&
214 !
Empty(element.ostring, arc.olabel)) {
218 Car(element.ostring, arc.olabel), arc.weight,
228 const auto weight = element.state ==
kNoStateId 230 : fst_->Final(element.state);
231 if ((weight != Weight::Zero()) &&
232 (element.istring.size() + element.ostring.size() > 0)) {
254 size_t operator()(
const Element &x)
const {
255 size_t key = x.
state;
256 key = (key << 1) ^ x.
istring.size();
258 key = (key << 1) ^ label;
260 key = (key << 1) ^ x.
ostring.size();
262 key = (key << 1) ^ label;
275 size_t key = x.size();
276 for (
Label label : x) key = (key << 1) ^ label;
282 std::unordered_map<Element, StateId, ElementKey, ElementEqual>;
283 using StringSet = std::unordered_set<String, StringKey>;
285 std::unique_ptr<const Fst<Arc>> fst_;
286 std::vector<Element> elements_;
287 ElementMap element_map_;
288 StringSet string_set_;
344 GetMutableImpl()->InitArcIterator(s, data);
379 data->
base = std::make_unique<StateIterator<SynchronizeFst<Arc>>>(*this);
410 #endif // FST_SYNCHRONIZE_H_ SynchronizeFst(const SynchronizeFst &fst, bool safe=false)
StateIterator(const SynchronizeFst< Arc > &fst)
void SetProperties(uint64_t props)
size_t NumInputEpsilons(StateId s) const
virtual uint64_t Properties(uint64_t mask, bool test) const =0
bool HasFinal(StateId s) const
void SetFinal(StateId s, Weight weight=Weight::One())
size_t NumOutputEpsilons(StateId s)
void InitArcIterator(StateId s, ArcIteratorData< Arc > *data)
const SymbolTable * OutputSymbols() const
typename Arc::Weight Weight
constexpr uint64_t kError
void SetOutputSymbols(const SymbolTable *osyms)
typename SynchronizeFst< Arc >::Arc Arc
size_t NumArcs(StateId s) const
uint64_t Properties() const override
void InitStateIterator(StateIteratorData< Arc > *data) const override
StringView FindString(String &&str)
virtual uint64_t Properties() const
SynchronizeFst(const Fst< A > &fst, const SynchronizeFstOptions &opts=SynchronizeFstOptions())
size_t NumArcs(StateId s)
constexpr uint64_t kCopyProperties
typename CacheStore::State State
Element(StateId state_, StringView i, StringView o)
std::unique_ptr< StateIteratorBase< Arc > > base
typename Arc::StateId StateId
void InitArcIterator(StateId s, ArcIteratorData< Arc > *data) const
Label Car(StringView str, Label label=0) const
SynchronizeFstImpl(const SynchronizeFstImpl &impl)
void EmplaceArc(StateId s, T &&...ctor_args)
void SetInputSymbols(const SymbolTable *isyms)
typename Store::State State
bool HasArcs(StateId s) const
bool Empty(StringView str, Label label=0) const
constexpr uint64_t kFstProperties
uint64_t Properties(uint64_t mask) const override
ArcIterator(const SynchronizeFst< Arc > &fst, StateId s)
typename internal::SynchronizeFstImpl< Arc >::Arc Arc
std::basic_string< Label > String
typename Arc::Weight Weight
CacheOptions SynchronizeFstOptions
typename SynchronizeFst< Arc >::Arc Arc
virtual const SymbolTable * InputSymbols() const =0
const SymbolTable * InputSymbols() const
void SetType(std::string_view type)
Weight Final(StateId s) const
size_t NumInputEpsilons(StateId s)
StringView Cdr(StringView str, Label label=0)
typename Arc::Label Label
SynchronizeFst * Copy(bool safe=false) const override
void Synchronize(const Fst< Arc > &ifst, MutableFst< Arc > *ofst)
typename Arc::StateId StateId
typename Arc::StateId StateId
std::basic_string_view< Label > StringView
typename CacheState< Arc >::Arc Arc
Impl * GetMutableImpl() const
uint64_t SynchronizeProperties(uint64_t inprops)
size_t NumOutputEpsilons(StateId s) const
SynchronizeFstImpl(const Fst< Arc > &fst, const SynchronizeFstOptions &opts)
void InitArcIterator(StateId s, ArcIteratorData< Arc > *data) const override
const Impl * GetImpl() const
StringView Concat(StringView str, Label label=0)
virtual const SymbolTable * OutputSymbols() const =0
StateId FindState(const Element &element)