20 #ifndef FST_SYNCHRONIZE_H_ 21 #define FST_SYNCHRONIZE_H_ 29 #include <string_view> 38 #include <unordered_map> 39 #include <unordered_set> 53 using Label =
typename Arc::Label;
73 static_assert(
sizeof(
Label) <=
sizeof(char32_t),
74 "Label must fit in 32 bits. This is a hack.");
75 using String = std::basic_string<char32_t>;
110 auto start = fst_->Start();
121 const auto &element = elements_[s];
122 const auto weight = element.state ==
kNoStateId 124 : fst_->Final(element.state);
125 if ((weight != Weight::Zero()) && element.istring.empty() &&
126 element.ostring.empty()) {
154 if ((mask &
kError) && fst_->Properties(kError,
false)) {
179 return Concat(str.substr(1), label);
185 if (label) r.push_back(label);
199 const auto [str_it, unused] = string_set_.insert(std::forward<String>(str));
206 const auto &[iter, inserted] =
207 element_map_.emplace(element, elements_.size());
209 elements_.push_back(element);
217 const auto element = elements_[s];
221 const auto &arc = aiter.Value();
222 if (!
Empty(element.istring, arc.ilabel) &&
223 !
Empty(element.ostring, arc.olabel)) {
227 Car(element.ostring, arc.olabel), arc.weight,
237 const auto weight = element.state ==
kNoStateId 239 : fst_->Final(element.state);
240 if ((weight != Weight::Zero()) &&
241 (element.istring.size() + element.ostring.size() > 0)) {
263 size_t operator()(
const Element &x)
const {
264 size_t key = x.
state;
265 key = (key << 1) ^ x.
istring.size();
267 key = (key << 1) ^ label;
269 key = (key << 1) ^ x.
ostring.size();
271 key = (key << 1) ^ label;
284 size_t key = x.size();
285 for (
Label label : x) key = (key << 1) ^ label;
291 std::unordered_map<Element, StateId, ElementKey, ElementEqual>;
292 using StringSet = std::unordered_set<String, StringKey>;
294 std::unique_ptr<const Fst<Arc>> fst_;
295 std::vector<Element> elements_;
296 ElementMap element_map_;
297 StringSet string_set_;
353 GetMutableImpl()->InitArcIterator(s, data);
388 data->
base = std::make_unique<StateIterator<SynchronizeFst<Arc>>>(*this);
419 #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
typename Arc::Weight Weight
CacheOptions SynchronizeFstOptions
typename SynchronizeFst< Arc >::Arc Arc
virtual const SymbolTable * InputSymbols() const =0
const SymbolTable * InputSymbols() const
std::basic_string_view< char32_t > StringView
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
typename CacheState< Arc >::Arc Arc
Impl * GetMutableImpl() const
std::basic_string< char32_t > String
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)