00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef FST_SCRIPT_SHORTEST_PATH_H_
00018 #define FST_SCRIPT_SHORTEST_PATH_H_
00019
00020 #include <vector>
00021 using std::vector;
00022
00023 #include <fst/script/arg-packs.h>
00024 #include <fst/script/fst-class.h>
00025 #include <fst/script/weight-class.h>
00026 #include <fst/shortest-path.h>
00027 #include <fst/script/shortest-distance.h>
00028
00029 namespace fst {
00030 namespace script {
00031
00032 struct ShortestPathOptions
00033 : public fst::script::ShortestDistanceOptions {
00034 const size_t nshortest;
00035 const bool unique;
00036 const bool has_distance;
00037 const bool first_path;
00038 const WeightClass weight_threshold;
00039 const int64 state_threshold;
00040
00041 ShortestPathOptions(QueueType qt, size_t n = 1,
00042 bool u = false, bool hasdist = false,
00043 float d = fst::kDelta, bool fp = false,
00044 WeightClass w = fst::script::WeightClass::Zero(),
00045 int64 s = fst::kNoStateId)
00046 : ShortestDistanceOptions(qt, ANY_ARC_FILTER, kNoStateId, d),
00047 nshortest(n), unique(u), has_distance(hasdist), first_path(fp),
00048 weight_threshold(w), state_threshold(s) { }
00049 };
00050
00051 typedef args::Package<const FstClass &, MutableFstClass *,
00052 vector<WeightClass> *, const ShortestPathOptions &>
00053 ShortestPathArgs1;
00054
00055
00056 template<class Arc>
00057 void ShortestPath(ShortestPathArgs1 *args) {
00058 const Fst<Arc> &ifst = *(args->arg1.GetFst<Arc>());
00059 MutableFst<Arc> *ofst = args->arg2->GetMutableFst<Arc>();
00060 const ShortestPathOptions &opts = args->arg4;
00061 typedef typename Arc::StateId StateId;
00062 typedef typename Arc::Weight Weight;
00063 typedef AnyArcFilter<Arc> ArcFilter;
00064
00065 vector<typename Arc::Weight> weights;
00066 typename Arc::Weight weight_threshold =
00067 *(opts.weight_threshold.GetWeight<Weight>());
00068
00069 switch (opts.queue_type) {
00070 case AUTO_QUEUE: {
00071 typedef AutoQueue<StateId> Queue;
00072 Queue *queue = QueueConstructor<Queue, Arc,
00073 ArcFilter>::Construct(ifst, &weights);
00074 fst::ShortestPathOptions<Arc, Queue, ArcFilter> spopts(
00075 queue, ArcFilter(), opts.nshortest, opts.unique,
00076 opts.has_distance, opts.delta, opts.first_path,
00077 weight_threshold, opts.state_threshold);
00078 ShortestPath(ifst, ofst, &weights, spopts);
00079 delete queue;
00080 return;
00081 }
00082 case FIFO_QUEUE: {
00083 typedef FifoQueue<StateId> Queue;
00084 Queue *queue = QueueConstructor<Queue, Arc,
00085 ArcFilter>::Construct(ifst, &weights);
00086 fst::ShortestPathOptions<Arc, Queue, ArcFilter> spopts(
00087 queue, ArcFilter(), opts.nshortest, opts.unique,
00088 opts.has_distance, opts.delta, opts.first_path,
00089 weight_threshold, opts.state_threshold);
00090 ShortestPath(ifst, ofst, &weights, spopts);
00091 delete queue;
00092 return;
00093 }
00094 case LIFO_QUEUE: {
00095 typedef LifoQueue<StateId> Queue;
00096 Queue *queue = QueueConstructor<Queue, Arc,
00097 ArcFilter >::Construct(ifst, &weights);
00098 fst::ShortestPathOptions<Arc, Queue, ArcFilter> spopts(
00099 queue, ArcFilter(), opts.nshortest, opts.unique,
00100 opts.has_distance, opts.delta, opts.first_path,
00101 weight_threshold, opts.state_threshold);
00102 ShortestPath(ifst, ofst, &weights, spopts);
00103 delete queue;
00104 return;
00105 }
00106 case SHORTEST_FIRST_QUEUE: {
00107 typedef NaturalShortestFirstQueue<StateId, Weight> Queue;
00108 Queue *queue = QueueConstructor<Queue, Arc,
00109 ArcFilter>::Construct(ifst, &weights);
00110 fst::ShortestPathOptions<Arc, Queue, ArcFilter> spopts(
00111 queue, ArcFilter(), opts.nshortest, opts.unique,
00112 opts.has_distance, opts.delta, opts.first_path,
00113 weight_threshold, opts.state_threshold);
00114 ShortestPath(ifst, ofst, &weights, spopts);
00115 delete queue;
00116 return;
00117 }
00118 case STATE_ORDER_QUEUE: {
00119 typedef StateOrderQueue<StateId> Queue;
00120 Queue *queue = QueueConstructor<Queue, Arc,
00121 ArcFilter>::Construct(ifst, &weights);
00122 fst::ShortestPathOptions<Arc, Queue, ArcFilter> spopts(
00123 queue, ArcFilter(), opts.nshortest, opts.unique,
00124 opts.has_distance, opts.delta, opts.first_path,
00125 weight_threshold, opts.state_threshold);
00126 ShortestPath(ifst, ofst, &weights, spopts);
00127 delete queue;
00128 return;
00129 }
00130 case TOP_ORDER_QUEUE: {
00131 typedef TopOrderQueue<StateId> Queue;
00132 Queue *queue = QueueConstructor<Queue, Arc,
00133 ArcFilter>::Construct(ifst, &weights);
00134 fst::ShortestPathOptions<Arc, Queue, ArcFilter> spopts(
00135 queue, ArcFilter(), opts.nshortest, opts.unique,
00136 opts.has_distance, opts.delta, opts.first_path,
00137 weight_threshold, opts.state_threshold);
00138 ShortestPath(ifst, ofst, &weights, spopts);
00139 delete queue;
00140 return;
00141 }
00142 default:
00143 LOG(FATAL) << "Unknown queue type: " << opts.queue_type;
00144 }
00145
00146
00147 CHECK(args->arg3);
00148
00149 args->arg3->resize(weights.size());
00150 for (unsigned i = 0; i < weights.size(); ++i) {
00151 (*args->arg3)[i] = WeightClass(weights[i]);
00152 }
00153 }
00154
00155
00156 typedef args::Package<const FstClass &, MutableFstClass *,
00157 size_t, bool, bool, WeightClass,
00158 int64> ShortestPathArgs2;
00159
00160 template<class Arc>
00161 void ShortestPath(ShortestPathArgs2 *args) {
00162 const Fst<Arc> &ifst = *(args->arg1.GetFst<Arc>());
00163 MutableFst<Arc> *ofst = args->arg2->GetMutableFst<Arc>();
00164 typename Arc::Weight weight_threshold =
00165 *(args->arg6.GetWeight<typename Arc::Weight>());
00166
00167 ShortestPath(ifst, ofst, args->arg3, args->arg4, args->arg5,
00168 weight_threshold, args->arg7);
00169 }
00170
00171
00172
00173 void ShortestPath(const FstClass &ifst, MutableFstClass *ofst,
00174 vector<WeightClass> *distance,
00175 const ShortestPathOptions &opts);
00176
00177
00178
00179 void ShortestPath(const FstClass &ifst, MutableFstClass *ofst,
00180 size_t n = 1, bool unique = false,
00181 bool first_path = false,
00182 WeightClass weight_threshold =
00183 fst::script::WeightClass::Zero(),
00184 int64 state_threshold = fst::kNoStateId);
00185
00186 }
00187 }
00188
00189
00190
00191 #endif /// FST_SCRIPT_SHORTEST_PATH_H_
00192