22 #ifndef FST_STATE_MAP_H_ 23 #define FST_STATE_MAP_H_ 93 template <
class A,
class C>
105 const auto state = siter.Value();
106 mapper->SetState(state);
108 for (; !mapper->Done(); mapper->Next()) {
109 fst->
AddArc(state, mapper->Value());
111 fst->
SetFinal(state, mapper->Final(state));
118 template <
class A,
class C>
125 template <
class A,
class B,
class C>
150 const auto state = siter.Value();
151 mapper->SetState(state);
152 for (; !mapper->Done(); mapper->Next()) {
153 ofst->
AddArc(state, mapper->Value());
155 ofst->
SetFinal(state, mapper->Final(state));
163 template <
class A,
class B,
class C>
170 template <
class A,
class B,
class C>
174 template <
class A,
class B>
181 : base_(std::move(base)) {}
183 bool Done() const final {
return base_->Done(); }
187 void Next() final { base_->Next(); }
189 void Reset() final { base_->Reset(); }
192 std::unique_ptr<StateIteratorBase<A>> base_;
200 template <
class A,
class B,
class C>
226 mapper_(new C(mapper, fst_.get())),
241 fst_(impl.fst_->Copy(true)),
242 mapper_(new C(*impl.mapper_, fst_.get())),
248 if (own_mapper_)
delete mapper_;
252 if (!HasStart()) SetStart(mapper_->Start());
257 if (!HasFinal(state)) SetFinal(state, mapper_->Final(state));
262 if (!HasArcs(state))
Expand(state);
267 if (!HasArcs(state))
Expand(state);
272 if (!HasArcs(state))
Expand(state);
278 fst_->InitStateIterator(&data);
279 datb->
base = data.
base ? std::make_unique<StateMapStateIteratorBase<A, B>>(
280 std::move(data.
base))
286 if (!HasArcs(state))
Expand(state);
293 if ((mask &
kError) && (fst_->Properties(kError,
false) ||
294 (mapper_->Properties(0) &
kError))) {
295 SetProperties(kError, kError);
302 for (mapper_->SetState(state); !mapper_->Done(); mapper_->Next()) {
303 PushArc(state, mapper_->Value());
314 SetInputSymbols(fst_->InputSymbols());
316 SetInputSymbols(
nullptr);
319 SetOutputSymbols(fst_->OutputSymbols());
321 SetOutputSymbols(
nullptr);
324 SetProperties(mapper_->Properties(props));
327 std::unique_ptr<const Fst<A>> fst_;
336 template <
class A,
class B,
class C>
373 GetImpl()->InitStateIterator(data);
377 GetMutableImpl()->InitArcIterator(state, data);
389 template <
class A,
class B,
class C>
418 : fst_(
fst ? *
fst : mapper.fst_) {}
425 aiter_ = std::make_unique<ArcIterator<Fst<Arc>>>(fst_, state);
428 bool Done()
const {
return aiter_->Done(); }
430 const Arc &
Value()
const {
return aiter_->Value(); }
432 void Next() { aiter_->Next(); }
446 std::unique_ptr<ArcIterator<Fst<Arc>>> aiter_;
462 : fst_(
fst ? *
fst : mapper.fst_), i_(0) {}
471 arcs_.reserve(fst_.NumArcs(state));
474 arcs_.push_back(aiter.Value());
479 std::sort(arcs_.begin(), arcs_.end(), comp_);
481 for (
const auto &arc : arcs_) {
482 if (narcs > 0 && equal_(arc, arcs_[narcs - 1])) {
483 arcs_[narcs - 1].weight =
Plus(arcs_[narcs - 1].weight, arc.weight);
492 bool Done()
const {
return i_ >= arcs_.size(); }
513 bool operator()(
const Arc &x,
const Arc &y)
const {
514 if (x.ilabel < y.ilabel)
return true;
515 if (x.ilabel > y.ilabel)
return false;
516 if (x.olabel < y.olabel)
return true;
517 if (x.olabel > y.olabel)
return false;
518 if (x.nextstate < y.nextstate)
return true;
519 if (x.nextstate > y.nextstate)
return false;
525 bool operator()(
const Arc &x,
const Arc &y)
const {
526 return (x.ilabel == y.ilabel && x.olabel == y.olabel &&
527 x.nextstate == y.nextstate);
534 std::vector<Arc> arcs_;
554 : fst_(
fst ? *
fst : mapper.fst_), i_(0) {}
563 arcs_.reserve(fst_.NumArcs(state));
566 arcs_.push_back(aiter.Value());
570 std::sort(arcs_.begin(), arcs_.end(), comp_);
571 arcs_.erase(std::unique(arcs_.begin(), arcs_.end(), equal_), arcs_.end());
574 bool Done()
const {
return i_ >= arcs_.size(); }
594 bool operator()(
const Arc &x,
const Arc &y)
const {
595 if (x.ilabel < y.ilabel)
return true;
596 if (x.ilabel > y.ilabel)
return false;
597 if (x.olabel < y.olabel)
return true;
598 if (x.olabel > y.olabel)
return false;
599 if (x.nextstate < y.nextstate)
return true;
600 if (x.nextstate > y.nextstate)
return false;
606 bool operator()(
const Arc &x,
const Arc &y)
const {
607 return (x.ilabel == y.ilabel && x.olabel == y.olabel &&
608 x.nextstate == y.nextstate && x.weight == y.weight);
615 std::vector<Arc> arcs_;
629 #endif // FST_STATE_MAP_H_ constexpr MapSymbolsAction InputSymbolsAction() const
ssize_t NumOutputEpsilons(const ExpandedFst< Arc > &fst, typename Arc::StateId s)
constexpr MapSymbolsAction OutputSymbolsAction() const
typename Arc::StateId StateId
constexpr uint64_t kArcSortProperties
constexpr MapSymbolsAction OutputSymbolsAction() const
void InitArcIterator(StateId state, ArcIteratorData< B > *data) const override
typename Arc::StateId StateId
constexpr uint64_t kDeleteArcsProperties
constexpr uint64_t kWeightInvariantProperties
typename Arc::Weight Weight
virtual uint64_t Properties(uint64_t mask, bool test) const =0
ArcSumMapper(const Fst< Arc > &fst)
void InitArcIterator(StateId state, ArcIteratorData< B > *data)
constexpr MapSymbolsAction InputSymbolsAction() const
ErrorWeight Plus(const ErrorWeight &, const ErrorWeight &)
ArcIterator(const StateMapFst< A, B, C > &fst, StateId state)
ArcUniqueMapper(const ArcUniqueMapper< Arc > &mapper, const Fst< Arc > *fst=nullptr)
typename Arc::Weight Weight
const Arc & Value() const
Arc::Weight Final(const ExpandedFst< Arc > &fst, typename Arc::StateId s)
IdentityStateMapper(const Fst< Arc > &fst)
typename Arc::Weight Weight
constexpr uint64_t kError
virtual void SetInputSymbols(const SymbolTable *isyms)=0
uint64_t Properties(uint64_t mask) const override
~StateMapFstImpl() override
virtual void SetStart(StateId)=0
void SetState(StateId state)
ssize_t NumArcs(const ExpandedFst< Arc > &fst, typename Arc::StateId s)
typename Arc::StateId StateId
StateMapFst(const Fst< A > &fst, C *mapper)
typename Arc::StateId StateId
void SetState(StateId state)
StateMapFst(const Fst< A > &fst, C *mapper, const StateMapFstOptions &opts)
IdentityStateMapper(const IdentityStateMapper< Arc > &mapper, const Fst< Arc > *fst=nullptr)
ArcSumMapper(const ArcSumMapper< Arc > &mapper, const Fst< Arc > *fst=nullptr)
StateMapStateIteratorBase(std::unique_ptr< StateIteratorBase< A >> base)
Weight Final(StateId state)
StateMapFst * Copy(bool safe=false) const override
uint64_t Properties(uint64_t props) const
ssize_t NumInputEpsilons(const ExpandedFst< Arc > &fst, typename Arc::StateId s)
ArcUniqueMapper(const Fst< Arc > &fst)
constexpr uint64_t kCopyProperties
virtual void SetProperties(uint64_t props, uint64_t mask)=0
typename FirstCacheStore< VectorCacheStore< CacheState< Arc > > >::State State
typename Arc::Weight Weight
virtual void DeleteArcs(StateId, size_t)=0
size_t NumOutputEpsilons(StateId state)
virtual StateId Start() const =0
StateMapFstImpl(const StateMapFstImpl< A, B, C > &impl)
StateMapFst(const Fst< A > &fst, const C &mapper)
std::unique_ptr< StateIteratorBase< Arc > > base
size_t NumArcs(StateId state)
const Arc & Value() const
constexpr MapSymbolsAction InputSymbolsAction() const
const Fst< A > * GetFst() const
bool Equal(const Fst< Arc > &fst1, const Fst< Arc > &fst2, WeightEqual weight_equal, uint8_t etype=kEqualFsts)
typename Store::State State
void StateMap(MutableFst< A > *fst, C *mapper)
StateId Value() const final
typename Arc::StateId StateId
void Expand(StateId state)
Weight Final(StateId state) const
uint64_t Properties(uint64_t props) const
constexpr uint64_t kFstProperties
virtual void AddArc(StateId, const Arc &)=0
typename internal::StateMapFstImpl< Arc, Arc, ArcSortMapper< Arc, Compare > >::Arc Arc
StateMapFstImpl(const Fst< A > &fst, const C &mapper, const StateMapFstOptions &opts)
virtual const SymbolTable * InputSymbols() const =0
Arc::StateId CountStates(const Fst< Arc > &fst)
size_t NumInputEpsilons(StateId state)
typename A::StateId StateId
const Arc & Value() const
virtual StateId AddState()=0
void InitStateIterator(StateIteratorData< B > *data) const override
virtual void ReserveStates(size_t)
Weight Final(StateId state) const
virtual void SetFinal(StateId s, Weight weight=Weight::One())=0
virtual void DeleteStates(const std::vector< StateId > &)=0
typename Arc::Weight Weight
typename Arc::StateId StateId
void InitStateIterator(StateIteratorData< B > *datb) const
virtual void SetOutputSymbols(const SymbolTable *osyms)=0
void Expand(const Fst< Arc > &ifst, const std::vector< std::pair< typename Arc::Label, typename Arc::Label >> &parens, const std::vector< typename Arc::Label > &assignments, MutableFst< Arc > *ofst, const MPdtExpandOptions &opts)
StateMapFst(const StateMapFst &fst, bool safe=false)
internal::StateMapFstImpl< A, B, C > * GetMutableImpl() const
StateMapFstImpl(const Fst< A > &fst, C *mapper, const StateMapFstOptions &opts)
constexpr uint64_t kExpanded
constexpr MapSymbolsAction OutputSymbolsAction() const
StateMapFst(const Fst< A > &fst, const C &mapper, const StateMapFstOptions &opts)
uint64_t Properties(uint64_t props) const
Weight Final(StateId state) const
const internal::StateMapFstImpl< A, B, C > * GetImpl() const
void SetState(StateId state)
uint64_t Properties() const override
virtual const SymbolTable * OutputSymbols() const =0