21 #ifndef FST_MUTABLE_FST_H_ 22 #define FST_MUTABLE_FST_H_ 24 #include <sys/types.h> 38 #include <string_view> 68 virtual void SetProperties(uint64_t props, uint64_t mask) = 0;
84 virtual void DeleteStates(
const std::vector<StateId> &) = 0;
129 if (!hdr.
Read(strm, opts.
source))
return nullptr;
133 LOG(ERROR) <<
"MutableFst::Read: Not a MutableFst: " << ropts.
source;
136 const auto &fst_type = hdr.
FstType();
139 LOG(ERROR) <<
"MutableFst::Read: Unknown FST type \"" << fst_type
140 <<
"\" (arc type = \"" << A::Type() <<
"\"): " << ropts.
source;
143 auto *
fst = reader(strm, ropts);
144 if (!
fst)
return nullptr;
153 std::string_view convert_type =
"vector") {
154 if (convert ==
false) {
155 if (!source.empty()) {
156 std::ifstream strm(source,
157 std::ios_base::in | std::ios_base::binary);
159 LOG(ERROR) <<
"MutableFst::Read: Can't open file: " << source;
168 if (!ifst)
return nullptr;
169 if (ifst->Properties(
kMutable,
false)) {
172 std::unique_ptr<Fst<Arc>> ofst(
Convert(*ifst, convert_type));
174 if (!ofst)
return nullptr;
175 if (!ofst->Properties(
kMutable,
false)) {
176 LOG(ERROR) <<
"MutableFst: Bad convert type: " << convert_type;
196 virtual void SetValue(
const Arc &) = 0;
201 std::unique_ptr<MutableArcIteratorBase<Arc>>
base;
222 using Arc =
typename FST::Arc;
226 fst->InitMutableArcIterator(s, &data_);
229 bool Done()
const {
return data_.base->Done(); }
231 const Arc &
Value()
const {
return data_.base->Value(); }
233 void Next() { data_.base->Next(); }
235 size_t Position()
const {
return data_.base->Position(); }
237 void Reset() { data_.base->Reset(); }
239 void Seek(
size_t a) { data_.base->Seek(a); }
243 uint8_t
Flags()
const {
return data_.base->Flags(); }
246 return data_.base->SetFlags(flags, mask);
261 typename Arc::StateId s) {
272 typename Arc::StateId s) {
278 typename Arc::StateId s) {
289 template <
class Impl,
class FST = MutableFst<
typename Impl::Arc>>
292 using Arc =
typename Impl::Arc;
300 GetMutableImpl()->SetStart(s);
305 GetMutableImpl()->SetFinal(s, std::move(weight));
312 if (GetImpl()->
Properties(exprops) != (props & exprops)) MutateCheck();
313 GetMutableImpl()->SetProperties(props, mask);
318 return GetMutableImpl()->AddState();
323 return GetMutableImpl()->AddStates(n);
328 GetMutableImpl()->AddArc(s, arc);
333 GetMutableImpl()->AddArc(s, std::forward<Arc>(arc));
338 GetMutableImpl()->DeleteStates(dstates);
343 const auto *isymbols = GetImpl()->InputSymbols();
344 const auto *osymbols = GetImpl()->OutputSymbols();
345 SetImpl(std::make_shared<Impl>());
346 GetMutableImpl()->SetInputSymbols(isymbols);
347 GetMutableImpl()->SetOutputSymbols(osymbols);
349 GetMutableImpl()->DeleteStates();
355 GetMutableImpl()->DeleteArcs(s, n);
360 GetMutableImpl()->DeleteArcs(s);
365 GetMutableImpl()->ReserveStates(n);
370 GetMutableImpl()->ReserveArcs(s, n);
374 return GetImpl()->InputSymbols();
378 return GetImpl()->OutputSymbols();
383 return GetMutableImpl()->InputSymbols();
388 return GetMutableImpl()->OutputSymbols();
393 GetMutableImpl()->SetInputSymbols(isyms);
398 GetMutableImpl()->SetOutputSymbols(osyms);
415 if (!Unique()) SetImpl(std::make_shared<Impl>(*
this));
421 #endif // FST_MUTABLE_FST_H_
void DeleteArcs(StateId s, size_t n) override
void ReserveArcs(StateId s, size_t n) override
void DeleteStates() override
void AddArc(StateId s, const Arc &arc) override
void Convert(FarReader< Arc > &reader, FarWriter< Arc > &writer, std::string_view fst_type)
constexpr uint64_t kMutable
void SetStart(StateId s) override
void ReserveStates(size_t n) override
static MutableFst * Read(std::istream &strm, const FstReadOptions &opts)
virtual uint64_t Properties(uint64_t mask, bool test) const =0
virtual SymbolTable * MutableOutputSymbols()=0
std::unique_ptr< MutableArcIteratorBase< Arc > > base
void SetFinal(StateId s, Weight weight=Weight::One()) override
virtual size_t NumArcs(StateId) const =0
const SymbolTable * OutputSymbols() const override
static MutableFst * Read(const std::string &source, bool convert=false, std::string_view convert_type="vector")
typename fst::MutableFst< Arc >::Arc Arc
typename Arc::StateId StateId
typename Arc::Weight Weight
virtual void InitMutableArcIterator(StateId s, MutableArcIteratorData< Arc > *data)=0
const SymbolTable * InputSymbols() const override=0
virtual void SetInputSymbols(const SymbolTable *isyms)=0
void SetProperties(uint64_t props, uint64_t mask) override
virtual Weight Final(StateId) const =0
SymbolTable * MutableOutputSymbols() override
virtual void SetStart(StateId)=0
void DeleteArcs(StateId s) override
MutableFst * Copy(bool safe=false) const override=0
void SetValue(const Arc &arc)
SymbolTable * MutableInputSymbols() override
const Arc & Value() const
static FstRegister< Arc > * GetRegister()
virtual void ReserveArcs(StateId, size_t)
virtual size_t NumInputEpsilons(StateId) const =0
void AddStates(size_t n) override
MutableArcIterator(FST *fst, StateId s)
constexpr uint64_t kExtrinsicProperties
StateId AddState() override
const SymbolTable * OutputSymbols() const override=0
void SetOutputSymbols(const SymbolTable *osyms) override
ImplToMutableFst(const ImplToMutableFst &fst, bool safe)
void SetFlags(uint8_t flags, uint8_t mask)
virtual void SetProperties(uint64_t props, uint64_t mask)=0
void SetInputSymbols(const SymbolTable *isyms) override
virtual void AddArc(StateId state, Arc &&arc)
virtual void DeleteArcs(StateId, size_t)=0
MutableFst & operator=(const MutableFst &fst)
void DeleteStates(const std::vector< StateId > &dstates) override
typename Arc::StateId StateId
virtual MutableFst< Arc > & operator=(const Fst< Arc > &fst)=0
virtual SymbolTable * MutableInputSymbols()=0
virtual void AddArc(StateId, const Arc &)=0
ImplToMutableFst(std::shared_ptr< Impl > impl)
virtual StateId AddState()=0
virtual void ReserveStates(size_t)
virtual void SetFinal(StateId s, Weight weight=Weight::One())=0
const SymbolTable * InputSymbols() const override
typename Arc::StateId StateId
virtual void SetOutputSymbols(const SymbolTable *osyms)=0
virtual size_t NumOutputEpsilons(StateId) const =0
void AddArc(StateId s, Arc &&arc) override
virtual void DeleteStates()=0
virtual void AddStates(size_t)=0