22 #ifndef FST_STATE_MAP_H_ 23 #define FST_STATE_MAP_H_ 25 #include <sys/types.h> 102 template <
class A,
class C>
114 const auto state = siter.Value();
115 mapper->SetState(state);
117 for (; !mapper->Done(); mapper->Next()) {
118 fst->
AddArc(state, mapper->Value());
120 fst->
SetFinal(state, mapper->Final(state));
127 template <
class A,
class C>
134 template <
class A,
class B,
class C>
153 if (std::optional<typename A::StateId> num_states = ifst.
NumStatesIfKnown()) {
161 const auto state = siter.Value();
162 mapper->SetState(state);
163 for (; !mapper->Done(); mapper->Next()) {
164 ofst->
AddArc(state, mapper->Value());
166 ofst->
SetFinal(state, mapper->Final(state));
174 template <
class A,
class B,
class C>
181 template <
class A,
class B,
class C>
185 template <
class A,
class B>
192 : base_(std::move(base)) {}
194 bool Done() const final {
return base_->Done(); }
198 void Next() final { base_->Next(); }
200 void Reset() final { base_->Reset(); }
203 std::unique_ptr<StateIteratorBase<A>> base_;
211 template <
class A,
class B,
class C>
237 mapper_(new C(mapper, fst_.get())),
252 fst_(impl.fst_->Copy(true)),
253 mapper_(new C(*impl.mapper_, fst_.get())),
259 if (own_mapper_)
delete mapper_;
263 if (!HasStart()) SetStart(mapper_->Start());
268 if (!HasFinal(state)) SetFinal(state, mapper_->Final(state));
273 if (!HasArcs(state))
Expand(state);
278 if (!HasArcs(state))
Expand(state);
283 if (!HasArcs(state))
Expand(state);
289 fst_->InitStateIterator(&data);
290 datb->
base = data.
base ? std::make_unique<StateMapStateIteratorBase<A, B>>(
291 std::move(data.
base))
297 if (!HasArcs(state))
Expand(state);
304 if ((mask &
kError) && (fst_->Properties(kError,
false) ||
305 (mapper_->Properties(0) &
kError))) {
306 SetProperties(kError, kError);
313 for (mapper_->SetState(state); !mapper_->Done(); mapper_->Next()) {
314 PushArc(state, mapper_->Value());
325 SetInputSymbols(fst_->InputSymbols());
327 SetInputSymbols(
nullptr);
330 SetOutputSymbols(fst_->OutputSymbols());
332 SetOutputSymbols(
nullptr);
335 SetProperties(mapper_->Properties(props));
338 std::unique_ptr<const Fst<A>> fst_;
347 template <
class A,
class B,
class C>
363 :
Base(std::make_shared<
Impl>(fst, mapper, opts)) {}
366 :
Base(std::make_shared<
Impl>(fst, mapper, opts)) {}
383 GetImpl()->InitStateIterator(data);
387 GetMutableImpl()->InitArcIterator(state, data);
392 using Base::GetMutableImpl;
399 template <
class A,
class B,
class C>
428 : fst_(
fst ? *
fst : mapper.fst_) {}
435 aiter_ = std::make_unique<ArcIterator<Fst<Arc>>>(fst_, state);
438 bool Done()
const {
return aiter_->Done(); }
440 const Arc &
Value()
const {
return aiter_->Value(); }
442 void Next() { aiter_->Next(); }
456 std::unique_ptr<ArcIterator<Fst<Arc>>> aiter_;
472 : fst_(
fst ? *
fst : mapper.fst_), i_(0) {}
481 arcs_.reserve(fst_.NumArcs(state));
484 arcs_.push_back(aiter.Value());
489 std::sort(arcs_.begin(), arcs_.end(), comp_);
491 for (
const auto &arc : arcs_) {
492 if (narcs > 0 && equal_(arc, arcs_[narcs - 1])) {
493 arcs_[narcs - 1].weight =
Plus(arcs_[narcs - 1].weight, arc.weight);
502 bool Done()
const {
return i_ >= arcs_.size(); }
523 bool operator()(
const Arc &x,
const Arc &y)
const {
524 if (x.ilabel < y.ilabel)
return true;
525 if (x.ilabel > y.ilabel)
return false;
526 if (x.olabel < y.olabel)
return true;
527 if (x.olabel > y.olabel)
return false;
528 if (x.nextstate < y.nextstate)
return true;
529 if (x.nextstate > y.nextstate)
return false;
535 bool operator()(
const Arc &x,
const Arc &y)
const {
536 return (x.ilabel == y.ilabel && x.olabel == y.olabel &&
537 x.nextstate == y.nextstate);
544 std::vector<Arc> arcs_;
564 : fst_(
fst ? *
fst : mapper.fst_), i_(0) {}
573 arcs_.reserve(fst_.NumArcs(state));
576 arcs_.push_back(aiter.Value());
580 std::sort(arcs_.begin(), arcs_.end(), comp_);
581 arcs_.erase(std::unique(arcs_.begin(), arcs_.end(), equal_), arcs_.end());
584 bool Done()
const {
return i_ >= arcs_.size(); }
604 bool operator()(
const Arc &x,
const Arc &y)
const {
605 if (x.ilabel < y.ilabel)
return true;
606 if (x.ilabel > y.ilabel)
return false;
607 if (x.olabel < y.olabel)
return true;
608 if (x.olabel > y.olabel)
return false;
609 if (x.nextstate < y.nextstate)
return true;
610 if (x.nextstate > y.nextstate)
return false;
616 bool operator()(
const Arc &x,
const Arc &y)
const {
617 return (x.ilabel == y.ilabel && x.olabel == y.olabel &&
618 x.nextstate == y.nextstate && x.weight == y.weight);
625 std::vector<Arc> arcs_;
639 #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
const Impl * GetImpl() 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
virtual std::optional< StateId > NumStatesIfKnown() 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
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
Impl * GetMutableImpl() const
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)
StateMapFstImpl(const Fst< A > &fst, C *mapper, const StateMapFstOptions &opts)
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
void SetState(StateId state)
uint64_t Properties() const override
virtual const SymbolTable * OutputSymbols() const =0