20 #ifndef FST_PROPERTIES_H_ 21 #define FST_PROPERTIES_H_ 23 #include <sys/types.h> 31 #include <string_view> 46 inline constexpr uint64_t
kExpanded = 0x0000000000000001ULL;
49 inline constexpr uint64_t
kMutable = 0x0000000000000002ULL;
52 inline constexpr uint64_t
kError = 0x0000000000000004ULL;
64 inline constexpr uint64_t
kAcceptor = 0x0000000000010000ULL;
79 inline constexpr uint64_t
kEpsilons = 0x0000000000400000ULL;
81 inline constexpr uint64_t
kNoEpsilons = 0x0000000000800000ULL;
84 inline constexpr uint64_t
kIEpsilons = 0x0000000001000000ULL;
89 inline constexpr uint64_t
kOEpsilons = 0x0000000004000000ULL;
104 inline constexpr uint64_t
kWeighted = 0x0000000100000000ULL;
109 inline constexpr uint64_t
kCyclic = 0x0000000400000000ULL;
111 inline constexpr uint64_t
kAcyclic = 0x0000000800000000ULL;
119 inline constexpr uint64_t
kTopSorted = 0x0000004000000000ULL;
136 inline constexpr uint64_t
kString = 0x0000100000000000ULL;
139 inline constexpr uint64_t
kNotString = 0x0000200000000000ULL;
151 kAcceptor | kIDeterministic | kODeterministic | kNoEpsilons | kNoIEpsilons |
152 kNoOEpsilons | kILabelSorted | kOLabelSorted | kUnweighted | kAcyclic |
153 kInitialAcyclic | kTopSorted | kAccessible | kCoAccessible | kString |
158 kAcceptor | kString | kUnweighted | kIDeterministic | kODeterministic |
159 kILabelSorted | kOLabelSorted | kAcyclic | kInitialAcyclic |
160 kUnweightedCycles | kTopSorted | kAccessible |
kCoAccessible;
164 kError | kAcceptor | kNotAcceptor | kIDeterministic | kNonIDeterministic |
165 kODeterministic | kNonODeterministic | kEpsilons | kNoEpsilons |
166 kIEpsilons | kNoIEpsilons | kOEpsilons | kNoOEpsilons | kILabelSorted |
167 kNotILabelSorted | kOLabelSorted | kNotOLabelSorted | kWeighted |
168 kUnweighted | kCyclic | kAcyclic | kInitialCyclic | kInitialAcyclic |
169 kTopSorted | kNotTopSorted | kAccessible | kNotAccessible | kCoAccessible |
170 kNotCoAccessible | kString | kNotString | kWeightedCycles |
175 kExpanded | kMutable | kAcceptor | kNotAcceptor | kIDeterministic |
176 kNonIDeterministic | kODeterministic | kNonODeterministic | kEpsilons |
177 kNoEpsilons | kIEpsilons | kNoIEpsilons | kOEpsilons | kNoOEpsilons |
178 kILabelSorted | kNotILabelSorted | kOLabelSorted | kNotOLabelSorted |
179 kWeighted | kUnweighted | kCyclic | kAcyclic | kInitialCyclic |
180 kInitialAcyclic | kTopSorted | kNotTopSorted | kAccessible |
181 kNotAccessible | kCoAccessible | kNotCoAccessible | kString | kNotString |
189 kExpanded | kMutable | kError | kAcceptor | kNotAcceptor | kIDeterministic |
190 kNonIDeterministic | kODeterministic | kNonODeterministic | kEpsilons |
191 kNoEpsilons | kIEpsilons | kNoIEpsilons | kOEpsilons | kNoOEpsilons |
192 kILabelSorted | kNotILabelSorted | kOLabelSorted | kNotOLabelSorted |
193 kWeighted | kUnweighted | kCyclic | kAcyclic | kTopSorted | kNotTopSorted |
198 kExpanded | kMutable | kError | kAcceptor | kNotAcceptor | kIDeterministic |
199 kNonIDeterministic | kODeterministic | kNonODeterministic | kEpsilons |
200 kNoEpsilons | kIEpsilons | kNoIEpsilons | kOEpsilons | kNoOEpsilons |
201 kILabelSorted | kNotILabelSorted | kOLabelSorted | kNotOLabelSorted |
202 kCyclic | kAcyclic | kInitialCyclic | kInitialAcyclic | kTopSorted |
203 kNotTopSorted | kAccessible | kNotAccessible | kWeightedCycles |
208 kExpanded | kMutable | kError | kAcceptor | kNotAcceptor | kIDeterministic |
209 kNonIDeterministic | kODeterministic | kNonODeterministic | kEpsilons |
210 kNoEpsilons | kIEpsilons | kNoIEpsilons | kOEpsilons | kNoOEpsilons |
211 kILabelSorted | kNotILabelSorted | kOLabelSorted | kNotOLabelSorted |
212 kWeighted | kUnweighted | kCyclic | kAcyclic | kInitialCyclic |
213 kInitialAcyclic | kTopSorted | kNotTopSorted | kNotAccessible |
218 kExpanded | kMutable | kError | kNotAcceptor | kNonIDeterministic |
219 kNonODeterministic | kEpsilons | kIEpsilons | kOEpsilons |
220 kNotILabelSorted | kNotOLabelSorted | kWeighted | kCyclic | kInitialCyclic |
228 kExpanded | kMutable | kError | kAcceptor | kIDeterministic |
229 kODeterministic | kNoEpsilons | kNoIEpsilons | kNoOEpsilons |
230 kILabelSorted | kOLabelSorted | kUnweighted | kAcyclic | kInitialAcyclic |
235 kExpanded | kMutable | kError | kAcceptor | kIDeterministic |
236 kODeterministic | kNoEpsilons | kNoIEpsilons | kNoOEpsilons |
237 kILabelSorted | kOLabelSorted | kUnweighted | kAcyclic | kInitialAcyclic |
242 kExpanded | kMutable | kError | kAcceptor | kNotAcceptor | kIDeterministic |
243 kNonIDeterministic | kODeterministic | kNonODeterministic | kEpsilons |
244 kNoEpsilons | kIEpsilons | kNoIEpsilons | kOEpsilons | kNoOEpsilons |
245 kILabelSorted | kNotILabelSorted | kOLabelSorted | kNotOLabelSorted |
246 kWeighted | kUnweighted | kCyclic | kAcyclic | kInitialCyclic |
247 kInitialAcyclic | kAccessible | kNotAccessible | kCoAccessible |
252 kExpanded | kMutable | kError | kAcceptor | kNotAcceptor | kIDeterministic |
253 kNonIDeterministic | kODeterministic | kNonODeterministic | kEpsilons |
254 kNoEpsilons | kIEpsilons | kNoIEpsilons | kOEpsilons | kNoOEpsilons |
255 kWeighted | kUnweighted | kCyclic | kAcyclic | kInitialCyclic |
256 kInitialAcyclic | kTopSorted | kNotTopSorted | kAccessible |
257 kNotAccessible | kCoAccessible | kNotCoAccessible | kString | kNotString |
262 kExpanded | kMutable | kError | kODeterministic | kNonODeterministic |
263 kOEpsilons | kNoOEpsilons | kOLabelSorted | kNotOLabelSorted | kWeighted |
264 kUnweighted | kCyclic | kAcyclic | kInitialCyclic | kInitialAcyclic |
265 kTopSorted | kNotTopSorted | kAccessible | kNotAccessible | kCoAccessible |
266 kNotCoAccessible | kString | kNotString | kWeightedCycles |
271 kExpanded | kMutable | kError | kIDeterministic | kNonIDeterministic |
272 kIEpsilons | kNoIEpsilons | kILabelSorted | kNotILabelSorted | kWeighted |
273 kUnweighted | kCyclic | kAcyclic | kInitialCyclic | kInitialAcyclic |
274 kTopSorted | kNotTopSorted | kAccessible | kNotAccessible | kCoAccessible |
275 kNotCoAccessible | kString | kNotString | kWeightedCycles |
281 kExpanded | kMutable | kError | kAcceptor | kNotAcceptor | kIDeterministic |
282 kNonIDeterministic | kODeterministic | kNonODeterministic | kEpsilons |
283 kNoEpsilons | kIEpsilons | kNoIEpsilons | kOEpsilons | kNoOEpsilons |
284 kILabelSorted | kNotILabelSorted | kOLabelSorted | kNotOLabelSorted |
285 kCyclic | kAcyclic | kInitialCyclic | kInitialAcyclic | kTopSorted |
286 kNotTopSorted | kAccessible | kNotAccessible | kCoAccessible |
292 kExpanded | kMutable | kError | kAcceptor | kNotAcceptor |
293 kNonIDeterministic | kNonODeterministic | kEpsilons | kIEpsilons |
294 kOEpsilons | kNotILabelSorted | kNotOLabelSorted | kWeighted | kUnweighted |
295 kCyclic | kAcyclic | kInitialCyclic | kInitialAcyclic | kNotTopSorted |
296 kNotAccessible | kCoAccessible | kNotCoAccessible | kNotString |
302 kExpanded | kMutable | kError | kAcceptor | kNotAcceptor | kIDeterministic |
303 kODeterministic | kNoEpsilons | kNoIEpsilons | kNoOEpsilons |
304 kILabelSorted | kOLabelSorted | kWeighted | kUnweighted | kCyclic |
305 kAcyclic | kInitialCyclic | kInitialAcyclic | kTopSorted | kAccessible |
306 kCoAccessible | kNotCoAccessible | kString | kWeightedCycles |
319 kTrinaryProperties & 0x5555555555555555ULL;
323 kTrinaryProperties & 0xaaaaaaaaaaaaaaaaULL;
335 template <
typename Weight>
337 const Weight &new_weight);
341 template <
typename A>
342 uint64_t
AddArcProperties(uint64_t inprops,
typename A::StateId s,
const A &arc,
348 uint64_t staticProps);
359 bool delayed =
false);
362 bool distinct_psubsequential_labels);
375 bool epsilon_on_call,
bool epsilon_on_return,
376 bool out_epsilon_on_call,
bool out_epsilon_on_return,
377 bool replace_transducer,
bool no_empty_fst,
378 bool all_ilabel_sorted,
bool all_olabel_sorted,
379 bool all_negative_or_dense);
392 bool delayed =
false);
398 if (inprops & kAcyclic) {
413 const auto outprops = inprops &
kError;
414 return outprops | kNullProperties | staticprops;
423 template <
typename Weight>
425 const Weight &new_weight) {
426 auto outprops = inprops;
427 if (old_weight != Weight::Zero() && old_weight != Weight::One()) {
428 outprops &= ~kWeighted;
430 if (new_weight != Weight::Zero() && new_weight != Weight::One()) {
432 outprops &= ~kUnweighted;
434 outprops &= kSetFinalProperties | kWeighted |
kUnweighted;
445 template <
typename Arc>
447 const Arc &arc,
const Arc *prev_arc) {
448 using Weight =
typename Arc::Weight;
449 auto outprops = inprops;
450 if (arc.ilabel != arc.olabel) {
452 outprops &= ~kAcceptor;
454 if (arc.ilabel == 0) {
456 outprops &= ~kNoIEpsilons;
457 if (arc.olabel == 0) {
459 outprops &= ~kNoEpsilons;
462 if (arc.olabel == 0) {
464 outprops &= ~kNoOEpsilons;
467 if (prev_arc->ilabel > arc.ilabel) {
469 outprops &= ~kILabelSorted;
471 if (prev_arc->olabel > arc.olabel) {
473 outprops &= ~kOLabelSorted;
476 if (arc.weight != Weight::Zero() && arc.weight != Weight::One()) {
478 outprops &= ~kUnweighted;
480 if (arc.nextstate <= s) {
482 outprops &= ~kTopSorted;
484 outprops &= kAddArcProperties | kAcceptor | kNoEpsilons | kNoIEpsilons |
485 kNoOEpsilons | kILabelSorted | kOLabelSorted | kUnweighted |
487 if (outprops & kTopSorted) {
502 ((props & kPosTrinaryProperties) << 1) |
503 ((props & kNegTrinaryProperties) >> 1);
510 const auto known_props = known_props1 & known_props2;
511 const auto incompat_props = (props1 & known_props) ^ (props2 & known_props);
512 if (incompat_props) {
514 for (
int i = 0; i < 64; ++i, prop <<= 1) {
515 if (prop & incompat_props) {
516 LOG(ERROR) <<
"CompatProperties: Mismatch: " 518 <<
": props1 = " << (props1 & prop ?
"true" :
"false")
519 <<
", props2 = " << (props2 & prop ?
"true" :
"false");
531 #endif // FST_PROPERTIES_H_ constexpr uint64_t kAddStateProperties
uint64_t ConcatProperties(uint64_t inprops1, uint64_t inprops2, bool delayed=false)
constexpr uint64_t kCyclic
uint64_t AddArcProperties(uint64_t inprops, typename A::StateId s, const A &arc, const A *prev_arc)
constexpr uint64_t kStateSortProperties
constexpr uint64_t kNotString
uint64_t RandGenProperties(uint64_t inprops, bool weighted)
constexpr uint64_t kArcSortProperties
constexpr uint64_t kMutable
constexpr uint64_t kWeightedCycles
constexpr uint64_t kDeleteArcsProperties
constexpr uint64_t kWeightInvariantProperties
uint64_t SetStartProperties(uint64_t inprops)
constexpr uint64_t kOEpsilons
constexpr uint64_t kInitialCyclic
uint64_t ComposeProperties(uint64_t inprops1, uint64_t inprops2)
constexpr uint64_t kCoAccessible
uint64_t RmEpsilonProperties(uint64_t inprops, bool delayed=false)
bool CompatProperties(uint64_t props1, uint64_t props2)
constexpr uint64_t kBinaryProperties
constexpr uint64_t kNotAccessible
constexpr uint64_t kNotTopSorted
uint64_t ShortestPathProperties(uint64_t props, bool tree=false)
constexpr uint64_t kTrinaryProperties
uint64_t AddStateProperties(uint64_t inprops)
uint64_t DeleteAllStatesProperties(uint64_t inprops, uint64_t staticProps)
constexpr uint64_t kError
uint64_t DeleteStatesProperties(uint64_t inprops)
constexpr uint64_t kRmSuperFinalProperties
constexpr uint64_t kInitialAcyclic
constexpr uint64_t kCompiledStringProperties
constexpr uint64_t kDeleteStatesProperties
constexpr uint64_t kUnweightedCycles
constexpr uint64_t kEpsilons
constexpr uint64_t kNotOLabelSorted
uint64_t SetFinalProperties(uint64_t inprops, const Weight &old_weight, const Weight &new_weight)
constexpr uint64_t kTopSorted
constexpr uint64_t kNegTrinaryProperties
constexpr uint64_t kODeterministic
uint64_t RelabelProperties(uint64_t inprops)
constexpr uint64_t kSetFinalProperties
constexpr uint64_t kExtrinsicProperties
constexpr uint64_t kNonIDeterministic
constexpr uint64_t kIntrinsicProperties
constexpr uint64_t kNotILabelSorted
uint64_t ReverseProperties(uint64_t inprops, bool has_superinitial)
uint64_t ClosureProperties(uint64_t inprops, bool star, bool delayed=false)
uint64_t UnionProperties(uint64_t inprops1, uint64_t inprops2, bool delayed=false)
constexpr uint64_t kNoOEpsilons
constexpr uint64_t kOLabelSorted
constexpr uint64_t kNotAcceptor
constexpr uint64_t kCopyProperties
constexpr uint64_t kAcyclic
uint64_t ReplaceProperties(const std::vector< uint64_t > &inprops, size_t root, bool epsilon_on_call, bool epsilon_on_return, bool out_epsilon_on_call, bool out_epsilon_on_return, bool replace_transducer, bool no_empty_fst, bool all_ilabel_sorted, bool all_olabel_sorted, bool all_negative_or_dense)
uint64_t FactorWeightProperties(uint64_t inprops)
constexpr uint64_t kNoEpsilons
uint64_t KnownProperties(uint64_t props)
uint64_t ReweightProperties(uint64_t inprops, bool added_start_epsilon)
constexpr uint64_t kAccessible
constexpr uint64_t kIDeterministic
constexpr uint64_t kOLabelInvariantProperties
constexpr uint64_t kNullProperties
uint64_t ComplementProperties(uint64_t inprops)
constexpr uint64_t kIEpsilons
constexpr uint64_t kAddArcProperties
constexpr uint64_t kILabelInvariantProperties
constexpr uint64_t kILabelSorted
constexpr uint64_t kFstProperties
constexpr uint64_t kUnweighted
uint64_t InvertProperties(uint64_t inprops)
uint64_t DeterminizeProperties(uint64_t inprops, bool has_subsequential_label, bool distinct_psubsequential_labels)
constexpr uint64_t kNonODeterministic
const std::string_view PropertyNames[]
constexpr uint64_t kPosTrinaryProperties
constexpr uint64_t kString
uint64_t DeleteArcsProperties(uint64_t inprops)
uint64_t ProjectProperties(uint64_t inprops, bool project_input)
constexpr uint64_t kNotCoAccessible
constexpr uint64_t kWeighted
constexpr uint64_t kExpanded
constexpr uint64_t kSetStartProperties
uint64_t SynchronizeProperties(uint64_t inprops)
constexpr uint64_t kNoIEpsilons
constexpr uint64_t kSetArcProperties
constexpr uint64_t kAddSuperFinalProperties
constexpr uint64_t kAcceptor