// See www.openfst.org for extensive documentation on this weighted // finite-state transducer library. #ifndef FST_SCRIPT_RANDEQUIVALENT_H_ #define FST_SCRIPT_RANDEQUIVALENT_H_ #include #include #include #include #include #include #include namespace fst { namespace script { using RandEquivalentInnerArgs = std::tuple &>; using RandEquivalentArgs = WithReturnValue; template void RandEquivalent(RandEquivalentArgs *args) { const Fst &fst1 = *(std::get<0>(args->args).GetFst()); const Fst &fst2 = *(std::get<1>(args->args).GetFst()); const auto seed = std::get<4>(args->args); const auto &opts = std::get<5>(args->args); switch (opts.selector) { case UNIFORM_ARC_SELECTOR: { const UniformArcSelector selector(seed); const RandGenOptions> ropts(selector, opts.max_length); args->retval = RandEquivalent(fst1, fst2, std::get<2>(args->args), std::get<3>(args->args), ropts); return; } case FAST_LOG_PROB_ARC_SELECTOR: { const FastLogProbArcSelector selector(seed); const RandGenOptions> ropts(selector, opts.max_length); args->retval = RandEquivalent(fst1, fst2, std::get<2>(args->args), std::get<3>(args->args), ropts); return; } case LOG_PROB_ARC_SELECTOR: { const LogProbArcSelector selector(seed); const RandGenOptions> ropts(selector, opts.max_length); args->retval = RandEquivalent(fst1, fst2, std::get<2>(args->args), std::get<3>(args->args), ropts); return; } } } bool RandEquivalent(const FstClass &fst1, const FstClass &fst2, int32 npath = 1, float delta = kDelta, time_t seed = time(nullptr), const RandGenOptions &opts = RandGenOptions(UNIFORM_ARC_SELECTOR)); } // namespace script } // namespace fst #endif // FST_SCRIPT_RANDEQUIVALENT_H_