20 #ifndef FST_COMPLEMENT_H_ 21 #define FST_COMPLEMENT_H_ 58 using Label =
typename Arc::Label;
79 : fst_(impl.fst_->Copy()) {
88 const auto start = fst_->Start();
94 if (s == 0 || fst_->Final(s - 1) == Weight::Zero()) {
97 return Weight::Zero();
102 return s == 0 ? 1 : fst_->NumArcs(s - 1) + 1;
106 return s == 0 ? 0 : fst_->NumInputEpsilons(s - 1);
110 return s == 0 ? 0 : fst_->NumOutputEpsilons(s - 1);
117 if ((mask &
kError) && fst_->Properties(kError,
false)) {
124 std::unique_ptr<const Fst<Arc>> fst_;
149 :
Base(std::make_shared<
Impl>(fst)) {
150 static constexpr
auto props =
153 FSTERROR() <<
"ComplementFst: Argument not an unweighted " 154 <<
"epsilon-free deterministic acceptor";
170 inline void InitArcIterator(
StateId s,
175 static constexpr
Label kRhoLabel = -2;
190 : siter_(*fst.GetImpl()->fst_), s_(0) {}
192 bool Done() const final {
return s_ > 0 && siter_.Done(); }
197 if (s_ != 0) siter_.Next();
221 std::make_unique<ArcIterator<Fst<Arc>>>(*fst.
GetImpl()->fst_, s - 1);
227 return pos_ > 0 && aiter_->Done();
237 arc_.weight = Weight::One();
240 arc_ = aiter_->Value();
247 if (s_ != 0 && pos_ > 0) aiter_->Next();
254 if (s_ != 0) aiter_->Reset();
274 std::unique_ptr<ArcIterator<Fst<Arc>>> aiter_;
283 data->
base = std::make_unique<StateIterator<ComplementFst<Arc>>>(*this);
289 data->
base = std::make_unique<ArcIterator<ComplementFst<Arc>>>(*
this, s);
297 #endif // FST_COMPLEMENT_H_ typename Arc::Label Label
void SetProperties(uint64_t props)
uint64_t Properties() const override
constexpr uint8_t kArcValueFlags
virtual uint64_t Properties(uint64_t mask, bool test) const =0
size_t NumOutputEpsilons(StateId s) const
Weight Final(StateId s) const
const Arc & Value() const final
typename Arc::Label Label
typename Arc::StateId StateId
const SymbolTable * OutputSymbols() const
constexpr uint64_t kError
uint8_t Flags() const final
size_t NumArcs(StateId s) const
void SetOutputSymbols(const SymbolTable *osyms)
ComplementFst(const Fst< Arc > &fst)
ComplementFstImpl(const Fst< Arc > &fst)
ComplementFstImpl(const ComplementFstImpl< Arc > &impl)
typename Arc::Weight Weight
typename Arc::StateId StateId
uint64_t Properties(uint64_t mask) const override
typename Arc::StateId StateId
const Impl * GetImpl() const
virtual uint64_t Properties() const
typename Arc::Weight Weight
constexpr uint64_t kCopyProperties
ArcIterator(const ComplementFst< Arc > &fst, StateId s)
void Seek(size_t a) final
ComplementFst(const ComplementFst &fst, bool safe=false)
constexpr uint64_t kNoEpsilons
std::unique_ptr< StateIteratorBase< Arc > > base
constexpr uint64_t kIDeterministic
StateId Value() const final
void SetFlags(uint8_t, uint8_t) final
std::unique_ptr< ArcIteratorBase< Arc > > base
uint64_t ComplementProperties(uint64_t inprops)
void SetInputSymbols(const SymbolTable *isyms)
StateIterator(const ComplementFst< Arc > &fst)
constexpr uint64_t kILabelSorted
void InitStateIterator(StateIteratorData< Arc > *data) const override
constexpr uint64_t kFstProperties
constexpr uint64_t kUnweighted
ComplementFst * Copy(bool safe=false) const override
virtual const SymbolTable * InputSymbols() const =0
const SymbolTable * InputSymbols() const
void SetType(std::string_view type)
typename Arc::StateId StateId
size_t NumInputEpsilons(StateId s) const
void InitArcIterator(StateId s, ArcIteratorData< Arc > *data) const override
size_t Position() const final
FstImpl & operator=(const FstImpl &impl)
constexpr uint64_t kAcceptor
virtual const SymbolTable * OutputSymbols() const =0