39 #ifndef FST_EDIT_FST_H_ 40 #define FST_EDIT_FST_H_ 50 #include <unordered_map> 70 template <
typename Arc,
typename WrappedFstT = ExpandedFst<Arc>,
71 typename MutableFstT = VectorFst<Arc>>
80 : edits_(other.edits_),
81 external_to_internal_ids_(other.external_to_internal_ids_),
82 edited_final_weights_(other.edited_final_weights_),
83 num_new_states_(other.num_new_states_) {}
93 edits_.Write(strm, edits_opts);
94 WriteType(strm, external_to_internal_ids_);
98 LOG(ERROR) <<
"EditFstData::Write: Write failed: " << opts.
source;
110 auto final_weight_it = GetFinalWeightIterator(s);
111 if (final_weight_it == NotInFinalWeightMap()) {
112 const auto it = GetEditedIdMapIterator(s);
113 return it == NotInEditedMap() ? wrapped->Final(s)
114 : edits_.Final(it->second);
116 return final_weight_it->second;
121 const auto it = GetEditedIdMapIterator(s);
122 return it == NotInEditedMap() ? wrapped->NumArcs(s)
123 : edits_.NumArcs(it->second);
127 const auto it = GetEditedIdMapIterator(s);
128 return it == NotInEditedMap() ? wrapped->NumInputEpsilons(s)
129 : edits_.NumInputEpsilons(it->second);
133 const auto it = GetEditedIdMapIterator(s);
134 return it == NotInEditedMap() ? wrapped->NumOutputEpsilons(s)
135 : edits_.NumOutputEpsilons(it->second);
139 edits_.SetProperties(props, mask);
149 const auto old_weight =
Final(s, wrapped);
150 const auto it = GetEditedIdMapIterator(s);
154 if (it == NotInEditedMap()) {
155 edited_final_weights_[s] = weight;
157 edits_.SetFinal(GetEditableInternalId(s, wrapped), weight);
164 external_to_internal_ids_[curr_num_states] = edits_.AddState();
166 return curr_num_states;
171 for (
size_t i = 0; i < n; ++i) {
172 curr_num_states =
AddState(curr_num_states);
178 const auto internal_id = GetEditableInternalId(s, wrapped);
179 const auto num_arcs = edits_.NumArcs(internal_id);
181 const Arc *prev_arc =
nullptr;
184 arc_it.
Seek(num_arcs - 1);
185 prev_arc = &(arc_it.
Value());
187 edits_.AddArc(internal_id, arc);
192 edits_.DeleteStates();
194 external_to_internal_ids_.clear();
195 edited_final_weights_.clear();
200 edits_.DeleteArcs(GetEditableInternalId(s, wrapped), n);
205 edits_.DeleteArcs(GetEditableInternalId(s, wrapped));
212 const WrappedFstT *wrapped)
const {
213 const auto it = GetEditedIdMapIterator(s);
214 if (it == NotInEditedMap()) {
215 VLOG(3) <<
"EditFstData::InitArcIterator: iterating on state " << s
216 <<
" of original FST";
217 wrapped->InitArcIterator(s, data);
219 VLOG(2) <<
"EditFstData::InitArcIterator: iterating on edited state " << s
220 <<
" (internal state ID: " << it->second <<
")";
221 edits_.InitArcIterator(it->second, data);
227 const WrappedFstT *wrapped) {
228 data->
base = std::make_unique<MutableArcIterator<MutableFstT>>(
229 &edits_, GetEditableInternalId(s, wrapped));
235 for (
auto it = external_to_internal_ids_.begin(); it != NotInEditedMap();
237 LOG(INFO) <<
"(external,internal)=(" << it->first <<
"," << it->second
245 typename std::unordered_map<StateId, StateId>::const_iterator
246 GetEditedIdMapIterator(
StateId s)
const {
247 return external_to_internal_ids_.find(s);
250 typename std::unordered_map<StateId, StateId>::const_iterator
251 NotInEditedMap()
const {
252 return external_to_internal_ids_.end();
255 typename std::unordered_map<StateId, Weight>::const_iterator
256 GetFinalWeightIterator(
StateId s)
const {
257 return edited_final_weights_.find(s);
260 typename std::unordered_map<StateId, Weight>::const_iterator
261 NotInFinalWeightMap()
const {
262 return edited_final_weights_.end();
268 StateId GetEditableInternalId(
StateId s,
const WrappedFstT *wrapped) {
269 auto id_map_it = GetEditedIdMapIterator(s);
270 if (id_map_it == NotInEditedMap()) {
271 StateId new_internal_id = edits_.AddState();
272 VLOG(2) <<
"EditFstData::GetEditableInternalId: editing state " << s
273 <<
" of original FST; new internal state id:" << new_internal_id;
274 external_to_internal_ids_[s] = new_internal_id;
276 !arc_iterator.Done(); arc_iterator.Next()) {
277 edits_.AddArc(new_internal_id, arc_iterator.Value());
280 auto final_weight_it = GetFinalWeightIterator(s);
281 if (final_weight_it == NotInFinalWeightMap()) {
282 edits_.SetFinal(new_internal_id, wrapped->Final(s));
284 edits_.SetFinal(new_internal_id, final_weight_it->second);
285 edited_final_weights_.erase(s);
287 return new_internal_id;
289 return id_map_it->second;
299 std::unordered_map<StateId, StateId> external_to_internal_ids_;
304 std::unordered_map<StateId, Weight> edited_final_weights_;
312 template <
typename A,
typename WrappedFstT,
typename MutableFstT>
320 edits_opts.
header =
nullptr;
328 std::unique_ptr<MutableFstT> edits(MutableFstT::Read(strm, edits_opts));
329 if (!edits)
return nullptr;
330 data->edits_ = *edits;
333 ReadType(strm, &data->external_to_internal_ids_);
334 ReadType(strm, &data->edited_final_weights_);
335 ReadType(strm, &data->num_new_states_);
337 LOG(ERROR) <<
"EditFst::Read: read failed: " << opts.
source;
360 template <
typename A,
typename WrappedFstT = ExpandedFst<A>,
361 typename MutableFstT = VectorFst<A>>
381 InheritPropertiesFromWrapped();
382 data_ = std::make_shared<EditFstData<Arc, WrappedFstT, MutableFstT>>();
399 : wrapped_(
down_cast<WrappedFstT *>(wrapped.Copy())) {
401 data_ = std::make_shared<EditFstData<Arc, WrappedFstT, MutableFstT>>();
403 data_->SetEditedProperties(wrapped_->Properties(
kFstProperties,
false),
405 InheritPropertiesFromWrapped();
412 wrapped_(
down_cast<WrappedFstT *>(impl.wrapped_->Copy(true))),
420 const auto edited_start = data_->EditedStart();
421 return edited_start ==
kNoStateId ? wrapped_->Start() : edited_start;
429 return data_->NumInputEpsilons(s, wrapped_.get());
433 return data_->NumOutputEpsilons(s, wrapped_.get());
437 return wrapped_->NumStates() + data_->NumNewStates();
450 WriteHeader(strm, header_opts, kFileVersion, &hdr);
455 wrapped_->Write(strm, wrapped_opts);
456 data_->Write(strm, opts);
459 LOG(ERROR) <<
"EditFst::Write: Write failed: " << opts.
source;
475 Weight old_weight = data_->SetFinal(s, weight, wrapped_.get());
484 return data_->AddState(NumStates());
491 return data_->AddStates(NumStates(), n);
497 const auto *prev_arc = data_->AddArc(s, arc, wrapped_.get());
503 FSTERROR() <<
": EditFstImpl::DeleteStates(const std::vector<StateId>&): " 504 <<
" not implemented";
514 data_->DeleteArcs(s, n, wrapped_.get());
521 data_->DeleteArcs(s, wrapped_.get());
533 data->
base =
nullptr;
539 data_->InitArcIterator(s, data, wrapped_.get());
545 data_->InitMutableArcIterator(s, data, wrapped_.get());
552 static constexpr
int kFileVersion = 2;
554 static constexpr
int kMinFileVersion = 2;
559 void InheritPropertiesFromWrapped() {
562 SetInputSymbols(wrapped_->InputSymbols());
563 SetOutputSymbols(wrapped_->OutputSymbols());
577 if (!data_.unique()) {
579 std::make_shared<EditFstData<Arc, WrappedFstT, MutableFstT>>(*data_);
585 std::unique_ptr<const WrappedFstT> wrapped_;
588 std::shared_ptr<EditFstData<Arc, WrappedFstT, MutableFstT>> data_;
591 template <
typename Arc,
typename WrappedFstT,
typename MutableFstT>
593 data_->DeleteStates();
596 wrapped_ = std::make_unique<MutableFstT>();
597 const auto new_props =
602 template <
typename Arc,
typename WrappedFstT,
typename MutableFstT>
608 if (!impl->ReadHeader(strm, opts, kMinFileVersion, &hdr))
return nullptr;
613 wrapped_opts.
header =
nullptr;
614 std::unique_ptr<Fst<Arc>> wrapped_fst(
Fst<Arc>::Read(strm, wrapped_opts));
615 if (!wrapped_fst)
return nullptr;
616 impl->wrapped_.reset(down_cast<WrappedFstT *>(wrapped_fst.release()));
617 impl->data_ = std::shared_ptr<EditFstData<Arc, WrappedFstT, MutableFstT>>(
619 if (!impl->data_)
return nullptr;
628 template <
typename A,
typename WrappedFstT = ExpandedFst<A>,
629 typename MutableFstT = VectorFst<A>>
631 internal::EditFstImpl<A, WrappedFstT, MutableFstT>> {
656 return new EditFst(*
this, safe);
665 SetImpl(std::make_shared<Impl>(fst));
671 auto *impl = Impl::Read(strm, opts);
672 return impl ?
new EditFst(std::shared_ptr<Impl>(impl)) :
nullptr;
679 return impl ?
new EditFst(std::shared_ptr<Impl>(impl)) :
nullptr;
683 return GetImpl()->Write(strm, opts);
686 bool Write(
const std::string &source)
const override {
691 GetImpl()->InitStateIterator(data);
695 GetImpl()->InitArcIterator(s, data);
700 GetMutableImpl()->InitMutableArcIterator(s, data);
713 #endif // FST_EDIT_FST_H_
EditFst * Copy(bool safe=false) const override
static EditFst * Read(std::istream &strm, const FstReadOptions &opts)
void ReserveArcs(StateId s, size_t n)
uint64_t AddArcProperties(uint64_t inprops, typename A::StateId s, const A &arc, const A *prev_arc)
void SetProperties(uint64_t props)
constexpr uint64_t kMutable
void InitMutableArcIterator(StateId s, MutableArcIteratorData< Arc > *data, const WrappedFstT *wrapped)
typename Arc::Weight Weight
Weight SetFinal(StateId s, Weight weight, const WrappedFstT *wrapped)
uint64_t SetStartProperties(uint64_t inprops)
bool Write(const std::string &source) const override
void AddArc(StateId s, const Arc &arc)
std::unique_ptr< MutableArcIteratorBase< Arc > > base
std::shared_ptr< Impl > GetSharedImpl() const
void InitArcIterator(StateId s, ArcIteratorData< Arc > *data) const
StateId NumStates() const
size_t NumInputEpsilons(StateId s, const WrappedFstT *wrapped) const
StateId AddState(StateId curr_num_states)
uint64_t AddStateProperties(uint64_t inprops)
uint64_t DeleteAllStatesProperties(uint64_t inprops, uint64_t staticProps)
constexpr uint64_t kError
size_t NumArcs(StateId s, const WrappedFstT *wrapped) const
EditFstImpl(const Fst< Arc > &wrapped)
void DeleteArcs(StateId s)
StateId NumNewStates() const
static EditFstData * Read(std::istream &strm, const FstReadOptions &opts)
void SetEditedProperties(uint64_t props, uint64_t mask)
uint64_t SetFinalProperties(uint64_t inprops, const Weight &old_weight, const Weight &new_weight)
typename Arc::StateId StateId
void DeleteStates(const std::vector< StateId > &dstates)
EditFst(const WrappedFstT &fst)
const Arc & Value() const
typename Arc::StateId StateId
std::ostream & WriteType(std::ostream &strm, const T t)
void AddStates(StateId curr_num_states, size_t n)
void DeleteArcs(StateId s, size_t n, const WrappedFstT *wrapped)
static EditFstImpl * Read(std::istream &strm, const FstReadOptions &opts)
typename Arc::Weight Weight
virtual uint64_t Properties() const
constexpr uint64_t kCopyProperties
Weight Final(StateId s, const WrappedFstT *wrapped) const
void DeleteArcs(StateId s, size_t n)
StateId EditedStart() const
void InitArcIterator(StateId s, ArcIteratorData< Arc > *data, const WrappedFstT *wrapped) const
void InitArcIterator(StateId s, ArcIteratorData< Arc > *data) const override
EditFst(const Fst< Arc > &fst)
size_t NumInputEpsilons(StateId s) const
std::unique_ptr< StateIteratorBase< Arc > > base
size_t NumOutputEpsilons(StateId s, const WrappedFstT *wrapped) const
bool Write(std::ostream &strm, const FstWriteOptions &opts) const override
EditFstImpl(const EditFstImpl &impl)
EditFstData(const EditFstData &other)
bool WriteFile(const std::string &source) const
void ReserveStates(StateId s)
constexpr uint64_t kFstProperties
Weight Final(StateId s) const
void InitStateIterator(StateIteratorData< Arc > *data) const override
static EditFst * Read(const std::string &source)
void SetType(std::string_view type)
const Arc * AddArc(StateId s, const Arc &arc, const WrappedFstT *wrapped)
void SetFinal(StateId s, Weight weight)
EditFst & operator=(const Fst< Arc > &fst) override
std::istream & ReadType(std::istream &strm, T *t)
uint64_t DeleteArcsProperties(uint64_t inprops)
void InitMutableArcIterator(StateId s, MutableArcIteratorData< Arc > *data)
typename Arc::StateId StateId
size_t NumArcs(StateId s) const
EditFst(const EditFst &fst, bool safe=false)
bool Write(std::ostream &strm, const FstWriteOptions &opts) const
size_t NumOutputEpsilons(StateId s) const
void InitMutableArcIterator(StateId s, MutableArcIteratorData< A > *data) override
void InitStateIterator(StateIteratorData< Arc > *data) const
constexpr uint64_t kExpanded
void DeleteArcs(StateId s, const WrappedFstT *wrapped)
bool Write(std::ostream &strm, const FstWriteOptions &opts) const
EditFst & operator=(const EditFst &fst)