21 #ifndef FST_MUTABLE_FST_H_ 22 #define FST_MUTABLE_FST_H_ 24 #include <sys/types.h> 44 #include <string_view> 73 virtual void SetProperties(uint64_t props, uint64_t mask) = 0;
89 virtual void DeleteStates(
const std::vector<StateId> &) = 0;
134 if (!hdr.
Read(strm, opts.
source))
return nullptr;
138 LOG(ERROR) <<
"MutableFst::Read: Not a MutableFst: " << ropts.
source;
141 const auto &fst_type = hdr.
FstType();
144 LOG(ERROR) <<
"MutableFst::Read: Unknown FST type \"" << fst_type
145 <<
"\" (arc type = \"" << A::Type() <<
"\"): " << ropts.
source;
148 auto *
fst = reader(strm, ropts);
149 if (!
fst)
return nullptr;
158 std::string_view convert_type =
"vector") {
159 if (convert ==
false) {
160 if (!source.empty()) {
161 std::ifstream strm(source,
162 std::ios_base::in | std::ios_base::binary);
164 LOG(ERROR) <<
"MutableFst::Read: Can't open file: " << source;
173 if (!ifst)
return nullptr;
174 if (ifst->Properties(
kMutable,
false)) {
177 std::unique_ptr<Fst<Arc>> ofst(
Convert(*ifst, convert_type));
179 if (!ofst)
return nullptr;
180 if (!ofst->Properties(
kMutable,
false)) {
181 LOG(ERROR) <<
"MutableFst: Bad convert type: " << convert_type;
201 virtual void SetValue(
const Arc &) = 0;
206 std::unique_ptr<MutableArcIteratorBase<Arc>>
base;
227 using Arc =
typename FST::Arc;
231 fst->InitMutableArcIterator(s, &data_);
234 bool Done()
const {
return data_.base->Done(); }
236 const Arc &
Value()
const {
return data_.base->Value(); }
238 void Next() { data_.base->Next(); }
240 size_t Position()
const {
return data_.base->Position(); }
242 void Reset() { data_.base->Reset(); }
244 void Seek(
size_t a) { data_.base->Seek(a); }
248 uint8_t
Flags()
const {
return data_.base->Flags(); }
251 return data_.base->SetFlags(flags, mask);
266 typename Arc::StateId s) {
277 typename Arc::StateId s) {
283 typename Arc::StateId s) {
294 template <
class Impl,
class FST = MutableFst<
typename Impl::Arc>>
297 using Arc =
typename Impl::Arc;
305 GetMutableImpl()->SetStart(s);
310 GetMutableImpl()->SetFinal(s, std::move(weight));
317 if (GetImpl()->
Properties(exprops) != (props & exprops)) MutateCheck();
318 GetMutableImpl()->SetProperties(props, mask);
323 return GetMutableImpl()->AddState();
328 return GetMutableImpl()->AddStates(n);
333 GetMutableImpl()->AddArc(s, arc);
338 GetMutableImpl()->AddArc(s, std::forward<Arc>(arc));
343 GetMutableImpl()->DeleteStates(dstates);
348 const auto *isymbols = GetImpl()->InputSymbols();
349 const auto *osymbols = GetImpl()->OutputSymbols();
350 SetImpl(std::make_shared<Impl>());
351 GetMutableImpl()->SetInputSymbols(isymbols);
352 GetMutableImpl()->SetOutputSymbols(osymbols);
354 GetMutableImpl()->DeleteStates();
360 GetMutableImpl()->DeleteArcs(s, n);
365 GetMutableImpl()->DeleteArcs(s);
370 GetMutableImpl()->ReserveStates(n);
375 GetMutableImpl()->ReserveArcs(s, n);
379 return GetImpl()->InputSymbols();
383 return GetImpl()->OutputSymbols();
388 return GetMutableImpl()->InputSymbols();
393 return GetMutableImpl()->OutputSymbols();
398 GetMutableImpl()->SetInputSymbols(isyms);
403 GetMutableImpl()->SetOutputSymbols(osyms);
420 if (!Unique()) SetImpl(std::make_shared<Impl>(*
this));
426 #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