20 #ifndef FST_TEST_PROPERTIES_H_ 21 #define FST_TEST_PROPERTIES_H_ 34 #include <unordered_set> 54 using Label =
typename Arc::Label;
55 using StateId =
typename Arc::StateId;
56 using Weight =
typename Arc::Weight;
64 constexpr uint64_t kDfsProps =
67 std::vector<StateId> scc;
73 if (mask & ~(kBinaryProperties | kDfsProps)) {
86 std::optional<std::unordered_set<Label>> ilabels;
87 std::optional<std::unordered_set<Label>> olabels;
90 StateId s = siter.Value();
99 bool first_arc =
true;
101 const auto &arc = aiter.Value();
102 if (ilabels && ilabels->find(arc.ilabel) != ilabels->end()) {
106 if (olabels && olabels->find(arc.olabel) != olabels->end()) {
110 if (arc.ilabel != arc.olabel) {
114 if (arc.ilabel == 0 && arc.olabel == 0) {
118 if (arc.ilabel == 0) {
122 if (arc.olabel == 0) {
127 if (arc.ilabel < prev_arc.ilabel) {
131 if (arc.olabel < prev_arc.olabel) {
136 if (arc.weight != Weight::One() && arc.weight != Weight::Zero()) {
140 scc[s] == scc[arc.nextstate]) {
142 comp_props &= ~kUnweightedCycles;
145 if (arc.nextstate <= s) {
149 if (arc.nextstate != s + 1) {
155 if (ilabels) ilabels->insert(arc.ilabel);
156 if (olabels) olabels->insert(arc.olabel);
163 const auto final_weight = fst.
Final(s);
164 if (final_weight != Weight::Zero()) {
165 if (final_weight != Weight::One()) {
195 if ((known_props & mask) == mask) {
196 if (known) *known = known_props;
209 if (FST_FLAGS_fst_verify_properties) {
213 FSTERROR() <<
"TestProperties: stored FST properties incorrect" 214 <<
" (stored: props1, computed: props2)";
216 return computed_props;
228 uint64_t test_mask) {
230 if (FST_FLAGS_fst_verify_properties) {
235 return props & (check_mask | test_mask);
241 #endif // FST_TEST_PROPERTIES_H_ constexpr uint64_t kCyclic
constexpr uint64_t kNotString
uint64_t TestProperties(const Fst< Arc > &fst, uint64_t mask, uint64_t *known)
uint64_t ComputeProperties(const Fst< Arc > &fst, uint64_t mask, uint64_t *known)
constexpr uint64_t kWeightedCycles
virtual uint64_t Properties(uint64_t mask, bool test) const =0
constexpr uint64_t kOEpsilons
constexpr uint64_t kInitialCyclic
virtual size_t NumArcs(StateId) const =0
constexpr uint64_t kCoAccessible
bool CompatProperties(uint64_t props1, uint64_t props2)
constexpr uint64_t kBinaryProperties
constexpr uint64_t kNotAccessible
constexpr uint64_t kNotTopSorted
void DfsVisit(const FST &fst, Visitor *visitor, ArcFilter filter, bool access_only=false)
constexpr uint64_t kInitialAcyclic
virtual Weight Final(StateId) const =0
constexpr uint64_t kUnweightedCycles
constexpr uint64_t kEpsilons
constexpr uint64_t kNotOLabelSorted
constexpr uint64_t kTopSorted
DECLARE_bool(fst_verify_properties)
constexpr uint64_t kODeterministic
constexpr uint64_t kNonIDeterministic
constexpr uint64_t kNotILabelSorted
constexpr uint64_t kNoOEpsilons
constexpr uint64_t kOLabelSorted
constexpr uint64_t kNotAcceptor
constexpr uint64_t kAcyclic
constexpr uint64_t kNoEpsilons
uint64_t CheckProperties(const Fst< Arc > &fst, uint64_t check_mask, uint64_t test_mask)
uint64_t KnownProperties(uint64_t props)
constexpr uint64_t kAccessible
virtual StateId Start() const =0
constexpr uint64_t kIDeterministic
constexpr uint64_t kIEpsilons
uint64_t ComputeOrUseStoredProperties(const Fst< Arc > &fst, uint64_t mask, uint64_t *known)
constexpr uint64_t kILabelSorted
constexpr uint64_t kFstProperties
constexpr uint64_t kUnweighted
constexpr uint64_t kNonODeterministic
constexpr uint64_t kString
constexpr uint64_t kNotCoAccessible
constexpr uint64_t kWeighted
constexpr uint64_t kNoIEpsilons
constexpr uint64_t kAcceptor