18 #ifndef FST_SCRIPT_FST_CLASS_H_ 19 #define FST_SCRIPT_FST_CLASS_H_ 27 #include <type_traits> 37 #include <string_view> 56 virtual const std::string &
ArcType()
const = 0;
58 virtual const std::string &
FstType()
const = 0;
60 virtual size_t NumArcs(int64_t)
const = 0;
64 virtual uint64_t
Properties(uint64_t,
bool)
const = 0;
65 virtual int64_t
Start()
const = 0;
66 virtual const std::string &
WeightType()
const = 0;
68 virtual bool Write(
const std::string &)
const = 0;
69 virtual bool Write(std::ostream &,
const std::string &)
const = 0;
76 virtual bool AddArc(int64_t,
const ArcClass &) = 0;
77 virtual int64_t AddState() = 0;
78 virtual void AddStates(
size_t) = 0;
80 virtual bool DeleteArcs(int64_t,
size_t) = 0;
81 virtual bool DeleteArcs(int64_t) = 0;
82 virtual bool DeleteStates(
const std::vector<int64_t> &) = 0;
83 virtual void DeleteStates() = 0;
86 virtual int64_t NumStates()
const = 0;
87 virtual bool ReserveArcs(int64_t,
size_t) = 0;
88 virtual void ReserveStates(int64_t) = 0;
89 virtual void SetInputSymbols(
const SymbolTable *) = 0;
90 virtual bool SetFinal(int64_t,
const WeightClass &) = 0;
91 virtual void SetOutputSymbols(
const SymbolTable *) = 0;
92 virtual void SetProperties(uint64_t, uint64_t) = 0;
93 virtual bool SetStart(int64_t) = 0;
106 : impl_(std::move(impl)) {}
116 Arc arc(ac.ilabel, ac.olabel, *ac.weight.GetWeight<
typename Arc::Weight>(),
132 const std::string &
ArcType() const final {
return Arc::Type(); }
152 for (
const auto &state : dstates)
156 std::vector<typename Arc::StateId> typed_dstates(dstates.size());
157 std::copy(dstates.begin(), dstates.end(), typed_dstates.begin());
173 const std::string &
FstType() const final {
return impl_->Type(); }
176 return impl_->InputSymbols();
192 : std::numeric_limits<size_t>::max();
198 : std::numeric_limits<size_t>::max();
204 : std::numeric_limits<size_t>::max();
213 return impl_->Properties(mask, test);
229 return impl_->OutputSymbols();
241 ->SetFinal(s, *weight.GetWeight<
typename Arc::Weight>());
262 int64_t
Start() const final {
return impl_->Start(); }
267 FSTERROR() <<
"Cannot get number of states for unexpanded FST";
272 FSTERROR() <<
"State ID " << s <<
" not valid";
278 const std::string &
WeightType() const final {
return Arc::Weight::Type(); }
280 bool Write(
const std::string &source)
const final {
281 return impl_->Write(source);
284 bool Write(std::ostream &ostr,
const std::string &source)
const final {
286 return impl_->Write(ostr, opts);
294 std::unique_ptr<Fst<Arc>> impl_;
314 : impl_(other.impl_ == nullptr ? nullptr : other.impl_->Copy()) {}
317 impl_.reset(other.impl_ ==
nullptr ?
nullptr : other.impl_->Copy());
323 const std::string &
ArcType() const final {
return impl_->ArcType(); }
325 const std::string &
FstType() const final {
return impl_->FstType(); }
328 return impl_->InputSymbols();
331 size_t NumArcs(int64_t s)
const final {
return impl_->NumArcs(s); }
334 return impl_->NumInputEpsilons(s);
338 return impl_->NumOutputEpsilons(s);
342 return impl_->OutputSymbols();
347 if (!impl_)
return kError & mask;
348 return impl_->Properties(mask, test);
351 static std::unique_ptr<FstClass> Read(
const std::string &source);
353 static std::unique_ptr<FstClass> Read(std::istream &istrm,
354 const std::string &source);
356 int64_t
Start() const final {
return impl_->Start(); }
358 bool ValidStateId(int64_t s)
const final {
return impl_->ValidStateId(s); }
360 const std::string &
WeightType() const final {
return impl_->WeightType(); }
366 std::string_view op_name)
const;
368 bool Write(
const std::string &source)
const final {
369 return impl_->Write(source);
372 bool Write(std::ostream &ostr,
const std::string &source)
const final {
373 return impl_->Write(ostr, source);
382 FSTERROR() <<
"Doesn't make sense to convert any class to type FstClass";
387 static std::unique_ptr<FstClassImplBase>
Create() {
388 FSTERROR() <<
"Doesn't make sense to create an FstClass with a " 389 <<
"particular arc type";
395 if (Arc::Type() !=
ArcType()) {
405 static std::unique_ptr<FstClass>
Read(std::istream &stream,
408 LOG(ERROR) <<
"FstClass::Read: Options header not specified";
413 return ReadTypedFst<MutableFstClass, MutableFst<Arc>>(stream, opts);
415 return ReadTypedFst<FstClass, Fst<Arc>>(stream, opts);
420 explicit FstClass(std::unique_ptr<FstClassImplBase> impl)
421 : impl_(std::move(impl)) {}
430 template <
class FstClassT,
class UnderlyingT>
433 std::unique_ptr<UnderlyingT> u(UnderlyingT::Read(stream, opts));
434 return u ? std::make_unique<FstClassT>(std::move(u)) :
nullptr;
438 std::unique_ptr<FstClassImplBase> impl_;
446 if (!WeightTypesMatch(ac.
weight,
"AddArc"))
return false;
447 return GetImpl()->AddArc(s, ac);
450 int64_t
AddState() {
return GetImpl()->AddState(); }
452 void AddStates(
size_t n) {
return GetImpl()->AddStates(n); }
454 bool DeleteArcs(int64_t s,
size_t n) {
return GetImpl()->DeleteArcs(s, n); }
456 bool DeleteArcs(int64_t s) {
return GetImpl()->DeleteArcs(s); }
459 return GetImpl()->DeleteStates(dstates);
465 return GetImpl()->MutableInputSymbols();
469 return GetImpl()->MutableOutputSymbols();
472 int64_t
NumStates()
const {
return GetImpl()->NumStates(); }
474 bool ReserveArcs(int64_t s,
size_t n) {
return GetImpl()->ReserveArcs(s, n); }
478 static std::unique_ptr<MutableFstClass> Read(
const std::string &source,
479 bool convert =
false);
482 GetImpl()->SetInputSymbols(isyms);
486 if (!WeightTypesMatch(weight,
"SetFinal"))
return false;
487 return GetImpl()->SetFinal(s, weight);
491 GetImpl()->SetOutputSymbols(osyms);
495 GetImpl()->SetProperties(props, mask);
498 bool SetStart(int64_t s) {
return GetImpl()->SetStart(s); }
514 FSTERROR() <<
"Doesn't make sense to convert any class to type " 515 <<
"MutableFstClass";
520 static std::unique_ptr<FstClassImplBase>
Create() {
521 FSTERROR() <<
"Doesn't make sense to create a MutableFstClass with a " 522 <<
"particular arc type";
534 static std::unique_ptr<MutableFstClass>
Read(std::istream &stream,
537 return mfst ? std::make_unique<MutableFstClass>(std::move(mfst)) :
nullptr;
554 static std::unique_ptr<VectorFstClass> Read(
const std::string &source);
557 static std::unique_ptr<VectorFstClass>
Read(std::istream &stream,
560 return vfst ? std::make_unique<VectorFstClass>(std::move(vfst)) :
nullptr;
575 return std::make_unique<FstClassImpl<Arc>>(
576 std::make_unique<VectorFst<Arc>>(*other.
GetFst<Arc>()));
580 static std::unique_ptr<FstClassImplBase>
Create() {
581 return std::make_unique<FstClassImpl<Arc>>(
582 std::make_unique<VectorFst<Arc>>());
590 template <
class Reader,
class Creator,
class Converter>
597 : reader(r), creator(cr), converter(co) {}
603 template <
class Reader,
class Creator,
class Converter>
606 FstClassRegEntry<Reader, Creator, Converter>,
607 FstClassIORegister<Reader, Creator, Converter>> {
610 return this->GetEntry(arc_type).reader;
614 return this->GetEntry(arc_type).creator;
618 return this->GetEntry(arc_type).converter;
623 std::string legal_type(key);
625 legal_type.append(
"-arc.so");
632 template <
class FstClassType>
634 using Reader = std::unique_ptr<FstClassType> (*)(std::istream &stream,
637 using Creator = std::unique_ptr<FstClassImplBase> (*)();
640 std::unique_ptr<FstClassImplBase> (*)(
const FstClass &other);
654 #define REGISTER_FST_CLASS(Class, Arc) \ 655 static FstClassIORegistration<Class>::Registerer Class##_##Arc##_registerer( \ 657 FstClassIORegistration<Class>::Entry( \ 658 Class::Read<Arc>, Class::Create<Arc>, Class::Convert<Arc>)) 660 #define REGISTER_FST_CLASSES(Arc) \ 661 REGISTER_FST_CLASS(FstClass, Arc); \ 662 REGISTER_FST_CLASS(MutableFstClass, Arc); \ 663 REGISTER_FST_CLASS(VectorFstClass, Arc); 668 #endif // FST_SCRIPT_FST_CLASS_H_ virtual const std::string & WeightType() const =0
static std::unique_ptr< FstClassImplBase > Convert(const FstClass &other)
int64_t NumStates() const
FstClass & operator=(const FstClass &other)
const Fst< Arc > * GetFst() const
constexpr uint64_t kMutable
void ConvertToLegalCSymbol(std::string *s)
FstClassImpl(std::unique_ptr< Fst< Arc >> impl)
Converter GetConverter(std::string_view arc_type) const
const std::string & ArcType() const final
VectorFstClass(const VectorFst< Arc > &fst)
std::unique_ptr< FstClassType >(*)(std::istream &stream, const FstReadOptions &opts) Reader
MutableFst< Arc > * GetMutableFst()
uint64_t Properties(uint64_t mask, bool test) const final
virtual size_t NumArcs(int64_t) const =0
size_t NumInputEpsilons(int64_t s) const final
FstClass(const FstClass &other)
virtual bool Write(const std::string &) const =0
~FstClassImplBase() override
FstClass(std::unique_ptr< FstClassImplBase > impl)
bool DeleteArcs(int64_t s)
const FstClassImplBase * GetImpl() const
bool ReserveArcs(int64_t s, size_t n)
int64_t Start() const final
constexpr uint64_t kError
void SetInputSymbols(const SymbolTable *isyms) final
const SymbolTable * InputSymbols() const final
bool Write(std::ostream &ostr, const std::string &source) const final
WeightClass Final(int64_t s) const final
virtual size_t NumInputEpsilons(int64_t) const =0
const std::string & ArcType() const final
const std::string & FstType() const final
bool SetFinal(int64_t s, const WeightClass &weight)
Reader GetReader(std::string_view arc_type) const
bool ValidStateId(int64_t s) const final
void ReserveStates(int64_t n) final
virtual const std::string & ArcType() const =0
FstClassImpl * Copy() final
bool DeleteArcs(int64_t s) final
virtual uint64_t Properties(uint64_t, bool) const =0
int64_t NumStates() const final
VectorFstClass(std::unique_ptr< FstClassImplBase > impl)
MutableFstClass(const MutableFst< Arc > &fst)
const std::string & WeightType() const final
void DeleteStates() final
bool DeleteArcs(int64_t s, size_t n)
WeightClass Final(int64_t s) const final
static std::unique_ptr< FstClassImplBase > Create()
bool SetStart(int64_t s) final
const std::string & FstType() const final
bool Write(const std::string &source) const final
virtual const SymbolTable * InputSymbols() const =0
MutableFstClass(std::unique_ptr< FstClassImplBase > impl)
bool DeleteArcs(int64_t s, size_t n) final
FstClassImpl(const Fst< Arc > &impl)
virtual int64_t Start() const =0
static std::unique_ptr< FstClass > Read(std::istream &stream, const FstReadOptions &opts)
FstClass(std::unique_ptr< Fst< Arc >> fst)
Fst< Arc > * GetImpl() const
void SetProperties(uint64_t props, uint64_t mask) final
size_t NumInputEpsilons(int64_t s) const final
std::unique_ptr< FstClassImplBase >(*)(const FstClass &other) Converter
virtual bool ValidStateId(int64_t) const =0
Creator GetCreator(std::string_view arc_type) const
bool SetFinal(int64_t s, const WeightClass &weight) final
bool Write(std::ostream &ostr, const std::string &source) const final
size_t NumOutputEpsilons(int64_t s) const final
constexpr To implicit_cast(typename internal::type_identity_t< To > to)
FstClassRegEntry(Reader r, Creator cr, Converter co)
const std::string & WeightType() const final
static std::unique_ptr< FstClassImplBase > Create()
void AddStates(size_t n) final
MutableFstClass(std::unique_ptr< MutableFst< Arc >> fst)
size_t NumArcs(int64_t s) const final
bool Write(const std::string &source) const final
static std::unique_ptr< FstClassImplBase > Convert(const FstClass &other)
bool ReserveArcs(int64_t s, size_t n) final
static std::unique_ptr< MutableFstClass > Read(std::istream &stream, const FstReadOptions &opts)
void SetOutputSymbols(const SymbolTable *osyms)
static std::unique_ptr< VectorFstClass > Read(std::istream &stream, const FstReadOptions &opts)
Arc::StateId CountStates(const Fst< Arc > &fst)
void SetProperties(uint64_t props, uint64_t mask)
FstClassImplBase * GetImpl()
bool AddArc(int64_t s, const ArcClass &ac)
std::string ConvertKeyToSoFilename(std::string_view key) const final
void SetOutputSymbols(const SymbolTable *osyms) final
VectorFstClass(std::unique_ptr< VectorFst< Arc >> fst)
const SymbolTable * OutputSymbols() const final
static WeightClass NoWeight(std::string_view weight_type)
virtual const std::string & FstType() const =0
void ReserveStates(int64_t n)
void SetInputSymbols(const SymbolTable *isyms)
bool DeleteStates(const std::vector< int64_t > &dstates)
FstClass(const Fst< Arc > &fst)
SymbolTable * MutableInputSymbols() final
virtual const SymbolTable * OutputSymbols() const =0
int64_t Start() const final
bool ValidStateId(int64_t s) const final
SymbolTable * MutableOutputSymbols()
virtual WeightClass Final(int64_t) const =0
constexpr uint64_t kExpanded
size_t NumArcs(int64_t s) const final
static std::unique_ptr< FstClassImplBase > Create()
static std::unique_ptr< FstClassImplBase > Convert(const FstClass &other)
const SymbolTable * InputSymbols() const final
bool DeleteStates(const std::vector< int64_t > &dstates) final
bool AddArc(int64_t s, const ArcClass &ac) final
virtual size_t NumOutputEpsilons(int64_t) const =0
uint64_t Properties(uint64_t mask, bool test) const final
size_t NumOutputEpsilons(int64_t s) const final
SymbolTable * MutableOutputSymbols() final
const SymbolTable * OutputSymbols() const final
static std::unique_ptr< FstClassT > ReadTypedFst(std::istream &stream, const FstReadOptions &opts)
SymbolTable * MutableInputSymbols()