1 2 // Licensed under the Apache License, Version 2.0 (the "License"); 3 // you may not use this file except in compliance with the License. 4 // You may obtain a copy of the License at 5 // 6 // http://www.apache.org/licenses/LICENSE-2.0 7 // 8 // Unless required by applicable law or agreed to in writing, software 9 // distributed under the License is distributed on an "AS IS" BASIS, 10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 // 14 // Copyright 2005-2010 Google, Inc. 15 // Author: jpr (at) google.com (Jake Ratkiewicz) 16 17 #ifndef FST_SCRIPT_PRUNE_H_ 18 #define FST_SCRIPT_PRUNE_H_ 19 20 #include <vector> 21 using std::vector; 22 23 #include <fst/script/arg-packs.h> 24 #include <fst/script/fst-class.h> 25 #include <fst/script/weight-class.h> 26 #include <fst/prune.h> 27 #include <fst/arcfilter.h> 28 29 namespace fst { 30 namespace script { 31 32 struct PruneOptions { 33 WeightClass weight_threshold; 34 int64 state_threshold; 35 const vector<WeightClass> *distance; 36 float delta; 37 38 explicit PruneOptions(const WeightClass& w, int64 s, 39 vector<WeightClass> *d = 0, float e = kDelta) 40 : weight_threshold(w), 41 state_threshold(s), 42 distance(d), 43 delta(e) {} 44 private: 45 PruneOptions(); // disallow 46 }; 47 48 // converts a script::PruneOptions into a fst::PruneOptions. 49 // Notes: 50 // If the original opts.distance is not NULL, a new distance will be 51 // created with new; it's the client's responsibility to delete this. 52 53 template<class A> 54 fst::PruneOptions<A, AnyArcFilter<A> > ConvertPruneOptions( 55 const PruneOptions &opts) { 56 typedef typename A::Weight Weight; 57 typedef typename A::StateId StateId; 58 59 Weight weight_threshold = *(opts.weight_threshold.GetWeight<Weight>()); 60 StateId state_threshold = opts.state_threshold; 61 vector<Weight> *distance = 0; 62 63 if (opts.distance) { 64 distance = new vector<Weight>(opts.distance->size()); 65 for (unsigned i = 0; i < opts.distance->size(); ++i) { 66 (*distance)[i] = *((*opts.distance)[i].GetWeight<Weight>()); 67 } 68 } 69 70 return fst::PruneOptions<A, AnyArcFilter<A> >( 71 weight_threshold, state_threshold, AnyArcFilter<A>(), distance, 72 opts.delta); 73 } 74 75 // 1 76 typedef args::Package<MutableFstClass *, const PruneOptions &> PruneArgs1; 77 78 template<class Arc> 79 void Prune(PruneArgs1 *args) { 80 MutableFst<Arc> *ofst = args->arg1->GetMutableFst<Arc>(); 81 82 typedef typename Arc::Weight Weight; 83 typedef typename Arc::StateId StateId; 84 85 fst::PruneOptions<Arc, AnyArcFilter<Arc> > opts = 86 ConvertPruneOptions<Arc>(args->arg2); 87 Prune(ofst, opts); 88 delete opts.distance; 89 } 90 91 // 2 92 typedef args::Package<const FstClass &, MutableFstClass *, 93 const PruneOptions &> PruneArgs2; 94 95 template<class Arc> 96 void Prune(PruneArgs2 *args) { 97 const Fst<Arc>& ifst = *(args->arg1.GetFst<Arc>()); 98 MutableFst<Arc> *ofst = args->arg2->GetMutableFst<Arc>(); 99 100 fst::PruneOptions<Arc, AnyArcFilter<Arc> > opts = 101 ConvertPruneOptions<Arc>(args->arg3); 102 Prune(ifst, ofst, opts); 103 delete opts.distance; 104 } 105 106 // 3 107 typedef args::Package<const FstClass &, 108 MutableFstClass *, 109 const WeightClass &, int64, float> PruneArgs3; 110 111 template<class Arc> 112 void Prune(PruneArgs3 *args) { 113 const Fst<Arc>& ifst = *(args->arg1.GetFst<Arc>()); 114 MutableFst<Arc> *ofst = args->arg2->GetMutableFst<Arc>(); 115 typename Arc::Weight w = *(args->arg3.GetWeight<typename Arc::Weight>()); 116 117 Prune(ifst, ofst, w, args->arg4, args->arg5); 118 } 119 120 // 4 121 typedef args::Package<MutableFstClass *, const WeightClass&, 122 int64, float> PruneArgs4; 123 template<class Arc> 124 void Prune(PruneArgs4 *args) { 125 MutableFst<Arc> *fst = args->arg1->GetMutableFst<Arc>(); 126 typename Arc::Weight w = *(args->arg2.GetWeight<typename Arc::Weight>()); 127 Prune(fst, w, args->arg3, args->arg4); 128 } 129 130 131 // 1 132 void Prune(MutableFstClass *fst, const PruneOptions &opts); 133 134 // 2 135 void Prune(const FstClass &ifst, MutableFstClass *fst, 136 const PruneOptions &opts); 137 138 // 3 139 void Prune(const FstClass &ifst, MutableFstClass *ofst, 140 const WeightClass &weight_threshold, 141 int64 state_threshold = kNoStateId, 142 float delta = kDelta); 143 144 // 4 145 void Prune(MutableFstClass *fst, const WeightClass& weight_threshold, 146 int64 state_threshold, float delta); 147 148 } // namespace script 149 } // namespace fst 150 151 152 153 #endif // FST_SCRIPT_PRUNE_H_ 154