18 #ifndef FST_SCRIPT_SHORTEST_DISTANCE_H_ 19 #define FST_SCRIPT_SHORTEST_DISTANCE_H_ 24 #include <type_traits> 51 int64_t source,
float delta)
52 : queue_type(queue_type),
53 arc_filter_type(arc_filter_type),
62 template <
class Arc,
class Queue,
class ArcFilter>
67 const std::vector<Weight> *) {
68 return std::make_unique<Queue>();
74 template <
class Arc,
class ArcFilter>
80 static std::unique_ptr<AutoQueue<StateId>>
Construct(
81 const Fst<Arc> &
fst,
const std::vector<Weight> *distance) {
82 return std::make_unique<AutoQueue<StateId>>(fst, distance, ArcFilter());
86 template <
class Arc,
class ArcFilter>
93 static std::unique_ptr<NaturalShortestFirstQueue<StateId, Weight>>
Construct(
94 const Fst<Arc> &,
const std::vector<Weight> *distance) {
95 return std::make_unique<NaturalShortestFirstQueue<StateId, Weight>>(
100 template <
class Arc,
class ArcFilter>
105 static std::unique_ptr<TopOrderQueue<StateId>>
Construct(
106 const Fst<Arc> &
fst,
const std::vector<Weight> *) {
107 return std::make_unique<TopOrderQueue<StateId>>(fst, ArcFilter());
111 template <
class Arc,
class Queue,
class ArcFilter>
113 std::vector<typename Arc::Weight> *distance,
115 std::unique_ptr<Queue> queue(
118 queue.get(), ArcFilter(), opts.
source, opts.
delta);
122 template <
class Arc,
class Queue>
124 std::vector<typename Arc::Weight> *distance,
128 ShortestDistance<Arc, Queue, AnyArcFilter<Arc>>(fst, distance, opts);
132 ShortestDistance<Arc, Queue, EpsilonArcFilter<Arc>>(fst, distance, opts);
136 ShortestDistance<Arc, Queue, InputEpsilonArcFilter<Arc>>(fst, distance,
141 ShortestDistance<Arc, Queue, OutputEpsilonArcFilter<Arc>>(fst, distance,
146 FSTERROR() <<
"ShortestDistance: Unknown arc filter type: " 147 <<
static_cast<std::underlying_type_t<ArcFilterType>
>(
150 distance->resize(1, Arc::Weight::NoWeight());
159 std::tuple<const FstClass &, std::vector<WeightClass> *,
164 using StateId =
typename Arc::StateId;
165 using Weight =
typename Arc::Weight;
166 const Fst<Arc> &
fst = *std::get<0>(*args).GetFst<Arc>();
167 const auto &opts = std::get<2>(*args);
168 std::vector<Weight> typed_distance;
169 switch (opts.queue_type) {
171 internal::ShortestDistance<Arc, AutoQueue<StateId>>(fst, &typed_distance,
176 internal::ShortestDistance<Arc, FifoQueue<StateId>>(fst, &typed_distance,
181 internal::ShortestDistance<Arc, LifoQueue<StateId>>(fst, &typed_distance,
189 fst, &typed_distance, opts);
191 FSTERROR() <<
"ShortestDistance: Bad queue type SHORTEST_FIRST_QUEUE" 192 <<
" for non-idempotent Weight " << Weight::Type();
197 internal::ShortestDistance<Arc, StateOrderQueue<StateId>>(
198 fst, &typed_distance, opts);
202 internal::ShortestDistance<Arc, TopOrderQueue<StateId>>(
203 fst, &typed_distance, opts);
207 FSTERROR() <<
"ShortestDistance: Unknown queue type: " << opts.queue_type;
208 typed_distance.clear();
209 typed_distance.resize(1, Arc::Weight::NoWeight());
217 std::tuple<const FstClass &, std::vector<WeightClass> *, bool,
double>;
221 using Weight =
typename Arc::Weight;
222 const Fst<Arc> &
fst = *std::get<0>(*args).GetFst<Arc>();
223 std::vector<Weight> typed_distance;
244 bool reverse =
false,
253 #endif // FST_SCRIPT_SHORTEST_DISTANCE_H_ typename Arc::StateId StateId
typename Arc::StateId StateId
const QueueType queue_type
std::tuple< const FstClass &, std::vector< WeightClass > *, bool, double > FstShortestDistanceArgs2
typename Arc::Weight Weight
typename Arc::StateId StateId
static std::unique_ptr< TopOrderQueue< StateId > > Construct(const Fst< Arc > &fst, const std::vector< Weight > *)
std::bool_constant<(W::Properties()&kIdempotent)!=0 > IsIdempotent
const ArcFilterType arc_filter_type
void CopyWeights(const std::vector< WeightClass > &weights, std::vector< Weight > *typed_weights)
static std::unique_ptr< AutoQueue< StateId > > Construct(const Fst< Arc > &fst, const std::vector< Weight > *distance)
void ShortestDistance(const Fst< Arc > &fst, std::vector< typename Arc::Weight > *distance, const ShortestDistanceOptions &opts)
static std::unique_ptr< Queue > Construct(const Fst< Arc > &, const std::vector< Weight > *)
typename Arc::Weight Weight
static std::unique_ptr< NaturalShortestFirstQueue< StateId, Weight > > Construct(const Fst< Arc > &, const std::vector< Weight > *distance)
ShortestDistanceOptions(QueueType queue_type, ArcFilterType arc_filter_type, int64_t source, float delta)
constexpr float kShortestDelta
void ShortestDistance(FstShortestDistanceArgs1 *args)
std::tuple< const FstClass &, std::vector< WeightClass > *, const ShortestDistanceOptions & > FstShortestDistanceArgs1
typename Arc::Weight Weight
typename Arc::Weight Weight
std::tuple< const FstClass &, double > FstShortestDistanceInnerArgs3