18 #ifndef FST_SCRIPT_SHORTEST_DISTANCE_H_ 19 #define FST_SCRIPT_SHORTEST_DISTANCE_H_ 44 int64_t source,
float delta)
45 : queue_type(queue_type),
46 arc_filter_type(arc_filter_type),
55 template <
class Arc,
class Queue,
class ArcFilter>
60 const std::vector<Weight> *) {
61 return std::make_unique<Queue>();
67 template <
class Arc,
class ArcFilter>
73 static std::unique_ptr<AutoQueue<StateId>>
Construct(
74 const Fst<Arc> &
fst,
const std::vector<Weight> *distance) {
75 return std::make_unique<AutoQueue<StateId>>(fst, distance, ArcFilter());
79 template <
class Arc,
class ArcFilter>
86 static std::unique_ptr<NaturalShortestFirstQueue<StateId, Weight>>
Construct(
87 const Fst<Arc> &,
const std::vector<Weight> *distance) {
88 return std::make_unique<NaturalShortestFirstQueue<StateId, Weight>>(
93 template <
class Arc,
class ArcFilter>
98 static std::unique_ptr<TopOrderQueue<StateId>>
Construct(
100 return std::make_unique<TopOrderQueue<StateId>>(fst, ArcFilter());
104 template <
class Arc,
class Queue,
class ArcFilter>
106 std::vector<typename Arc::Weight> *distance,
108 std::unique_ptr<Queue> queue(
111 queue.get(), ArcFilter(), opts.
source, opts.
delta);
115 template <
class Arc,
class Queue>
117 std::vector<typename Arc::Weight> *distance,
121 ShortestDistance<Arc, Queue, AnyArcFilter<Arc>>(fst, distance, opts);
125 ShortestDistance<Arc, Queue, EpsilonArcFilter<Arc>>(fst, distance, opts);
129 ShortestDistance<Arc, Queue, InputEpsilonArcFilter<Arc>>(fst, distance,
134 ShortestDistance<Arc, Queue, OutputEpsilonArcFilter<Arc>>(fst, distance,
139 FSTERROR() <<
"ShortestDistance: Unknown arc filter type: " 140 <<
static_cast<std::underlying_type_t<ArcFilterType>
>(
143 distance->resize(1, Arc::Weight::NoWeight());
152 std::tuple<const FstClass &, std::vector<WeightClass> *,
157 using StateId =
typename Arc::StateId;
158 using Weight =
typename Arc::Weight;
159 const Fst<Arc> &
fst = *std::get<0>(*args).GetFst<Arc>();
160 const auto &opts = std::get<2>(*args);
161 std::vector<Weight> typed_distance;
162 switch (opts.queue_type) {
164 internal::ShortestDistance<Arc, AutoQueue<StateId>>(fst, &typed_distance,
169 internal::ShortestDistance<Arc, FifoQueue<StateId>>(fst, &typed_distance,
174 internal::ShortestDistance<Arc, LifoQueue<StateId>>(fst, &typed_distance,
182 fst, &typed_distance, opts);
184 FSTERROR() <<
"ShortestDistance: Bad queue type SHORTEST_FIRST_QUEUE" 185 <<
" for non-idempotent Weight " << Weight::Type();
190 internal::ShortestDistance<Arc, StateOrderQueue<StateId>>(
191 fst, &typed_distance, opts);
195 internal::ShortestDistance<Arc, TopOrderQueue<StateId>>(
196 fst, &typed_distance, opts);
200 FSTERROR() <<
"ShortestDistance: Unknown queue type: " << opts.queue_type;
201 typed_distance.clear();
202 typed_distance.resize(1, Arc::Weight::NoWeight());
210 std::tuple<const FstClass &, std::vector<WeightClass> *, bool,
double>;
214 using Weight =
typename Arc::Weight;
215 const Fst<Arc> &
fst = *std::get<0>(*args).GetFst<Arc>();
216 std::vector<Weight> typed_distance;
237 bool reverse =
false,
246 #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