// Copyright 2005-2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the 'License'); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an 'AS IS' BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // See www.openfst.org for extensive documentation on this weighted // finite-state transducer library. #ifndef FST_SCRIPT_RANDGEN_H_ #define FST_SCRIPT_RANDGEN_H_ #include #include #include #include #include #include #include #include namespace fst { namespace script { using FstRandGenArgs = std::tuple &, uint64_t>; template void RandGen(FstRandGenArgs *args) { const Fst &ifst = *std::get<0>(*args).GetFst(); MutableFst *ofst = std::get<1>(*args)->GetMutableFst(); const auto &opts = std::get<2>(*args); const uint64_t seed = std::get<3>(*args); switch (opts.selector) { case RandArcSelection::UNIFORM: { const UniformArcSelector selector(seed); const RandGenOptions> ropts( selector, opts.max_length, opts.npath, opts.weighted, opts.remove_total_weight); RandGen(ifst, ofst, ropts); return; } case RandArcSelection::FAST_LOG_PROB: { const FastLogProbArcSelector selector(seed); const RandGenOptions> ropts( selector, opts.max_length, opts.npath, opts.weighted, opts.remove_total_weight); RandGen(ifst, ofst, ropts); return; } case RandArcSelection::LOG_PROB: { const LogProbArcSelector selector(seed); const RandGenOptions> ropts( selector, opts.max_length, opts.npath, opts.weighted, opts.remove_total_weight); RandGen(ifst, ofst, ropts); return; } } } void RandGen(const FstClass &ifst, MutableFstClass *ofst, const RandGenOptions &opts = RandGenOptions(RandArcSelection::UNIFORM), uint64_t seed = std::random_device()()); } // namespace script } // namespace fst #endif // FST_SCRIPT_RANDGEN_H_