1 // weight_test.h
2
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 //
15 // Copyright 2005-2010 Google, Inc.
16 // Author: riley@google.com (Michael Riley)
17 //
18 // \file
19 // Regression test for Fst weights.
20
21 #include <cstdlib>
22 #include <ctime>
23
24 #include <fst/expectation-weight.h>
25 #include <fst/float-weight.h>
26 #include <fst/random-weight.h>
27 #include "./weight-tester.h"
28
29 DEFINE_int32(seed, -1, "random seed");
30 DEFINE_int32(repeat, 100000, "number of test repetitions");
31
32 using fst::TropicalWeight;
33 using fst::TropicalWeightGenerator;
34 using fst::TropicalWeightTpl;
35 using fst::TropicalWeightGenerator_;
36
37 using fst::LogWeight;
38 using fst::LogWeightGenerator;
39 using fst::LogWeightTpl;
40 using fst::LogWeightGenerator_;
41
42 using fst::MinMaxWeight;
43 using fst::MinMaxWeightGenerator;
44 using fst::MinMaxWeightTpl;
45 using fst::MinMaxWeightGenerator_;
46
47 using fst::StringWeight;
48 using fst::StringWeightGenerator;
49
50 using fst::GallicWeight;
51 using fst::GallicWeightGenerator;
52
53 using fst::LexicographicWeight;
54 using fst::LexicographicWeightGenerator;
55
56 using fst::ProductWeight;
57 using fst::ProductWeightGenerator;
58
59 using fst::PowerWeight;
60 using fst::PowerWeightGenerator;
61
62 using fst::SignedLogWeightTpl;
63 using fst::SignedLogWeightGenerator_;
64
65 using fst::ExpectationWeight;
66
67 using fst::SparsePowerWeight;
68 using fst::SparsePowerWeightGenerator;
69
70 using fst::STRING_LEFT;
71 using fst::STRING_RIGHT;
72
73 using fst::WeightTester;
74
75 template <class T>
TestTemplatedWeights(int repeat,int seed)76 void TestTemplatedWeights(int repeat, int seed) {
77 TropicalWeightGenerator_<T> tropical_generator(seed);
78 WeightTester<TropicalWeightTpl<T>, TropicalWeightGenerator_<T> >
79 tropical_tester(tropical_generator);
80 tropical_tester.Test(repeat);
81
82 LogWeightGenerator_<T> log_generator(seed);
83 WeightTester<LogWeightTpl<T>, LogWeightGenerator_<T> >
84 log_tester(log_generator);
85 log_tester.Test(repeat);
86
87 MinMaxWeightGenerator_<T> minmax_generator(seed);
88 WeightTester<MinMaxWeightTpl<T>, MinMaxWeightGenerator_<T> >
89 minmax_tester(minmax_generator);
90 minmax_tester.Test(repeat);
91
92 SignedLogWeightGenerator_<T> signedlog_generator(seed);
93 WeightTester<SignedLogWeightTpl<T>, SignedLogWeightGenerator_<T> >
94 signedlog_tester(signedlog_generator);
95 signedlog_tester.Test(repeat);
96 }
97
main(int argc,char ** argv)98 int main(int argc, char **argv) {
99 std::set_new_handler(FailedNewHandler);
100 SET_FLAGS(argv[0], &argc, &argv, true);
101
102 int seed = FLAGS_seed >= 0 ? FLAGS_seed : time(0);
103 LOG(INFO) << "Seed = " << seed;
104
105 TestTemplatedWeights<float>(FLAGS_repeat, seed);
106 TestTemplatedWeights<double>(FLAGS_repeat, seed);
107 FLAGS_fst_weight_parentheses = "()";
108 TestTemplatedWeights<float>(FLAGS_repeat, seed);
109 TestTemplatedWeights<double>(FLAGS_repeat, seed);
110 FLAGS_fst_weight_parentheses = "";
111
112 // Make sure type names for templated weights are consistent
113 CHECK(TropicalWeight::Type() == "tropical");
114 CHECK(TropicalWeightTpl<double>::Type() != TropicalWeightTpl<float>::Type());
115 CHECK(LogWeight::Type() == "log");
116 CHECK(LogWeightTpl<double>::Type() != LogWeightTpl<float>::Type());
117 TropicalWeightTpl<double> w(15.0);
118 TropicalWeight tw(15.0);
119
120 StringWeightGenerator<int> left_string_generator(seed);
121 WeightTester<StringWeight<int>, StringWeightGenerator<int> >
122 left_string_tester(left_string_generator);
123 left_string_tester.Test(FLAGS_repeat);
124
125 StringWeightGenerator<int, STRING_RIGHT> right_string_generator(seed);
126 WeightTester<StringWeight<int, STRING_RIGHT>,
127 StringWeightGenerator<int, STRING_RIGHT> >
128 right_string_tester(right_string_generator);
129 right_string_tester.Test(FLAGS_repeat);
130
131 typedef GallicWeight<int, TropicalWeight> TropicalGallicWeight;
132 typedef GallicWeightGenerator<int, TropicalWeightGenerator>
133 TropicalGallicWeightGenerator;
134
135 TropicalGallicWeightGenerator tropical_gallic_generator(seed);
136 WeightTester<TropicalGallicWeight, TropicalGallicWeightGenerator>
137 tropical_gallic_tester(tropical_gallic_generator);
138 tropical_gallic_tester.Test(FLAGS_repeat);
139
140 typedef ProductWeight<TropicalWeight, TropicalWeight> TropicalProductWeight;
141 typedef ProductWeightGenerator<TropicalWeightGenerator,
142 TropicalWeightGenerator> TropicalProductWeightGenerator;
143
144 TropicalProductWeightGenerator tropical_product_generator(seed);
145 WeightTester<TropicalProductWeight, TropicalProductWeightGenerator>
146 tropical_product_weight_tester(tropical_product_generator);
147 tropical_product_weight_tester.Test(FLAGS_repeat);
148
149 typedef PowerWeight<TropicalWeight, 3> TropicalCubeWeight;
150 typedef PowerWeightGenerator<TropicalWeightGenerator, 3>
151 TropicalCubeWeightGenerator;
152
153 TropicalCubeWeightGenerator tropical_cube_generator(seed);
154 WeightTester<TropicalCubeWeight, TropicalCubeWeightGenerator>
155 tropical_cube_weight_tester(tropical_cube_generator);
156 tropical_cube_weight_tester.Test(FLAGS_repeat);
157
158 typedef ProductWeight<TropicalWeight, TropicalProductWeight>
159 SecondNestedProductWeight;
160 typedef ProductWeightGenerator<TropicalWeightGenerator,
161 TropicalProductWeightGenerator> SecondNestedProductWeightGenerator;
162
163 SecondNestedProductWeightGenerator second_nested_product_generator(seed);
164 WeightTester<SecondNestedProductWeight, SecondNestedProductWeightGenerator>
165 second_nested_product_weight_tester(second_nested_product_generator);
166 second_nested_product_weight_tester.Test(FLAGS_repeat);
167
168 // This only works with fst_weight_parentheses = "()"
169 typedef ProductWeight<TropicalProductWeight, TropicalWeight>
170 FirstNestedProductWeight;
171 typedef ProductWeightGenerator<TropicalProductWeightGenerator,
172 TropicalWeightGenerator> FirstNestedProductWeightGenerator;
173
174 FirstNestedProductWeightGenerator first_nested_product_generator(seed);
175 WeightTester<FirstNestedProductWeight, FirstNestedProductWeightGenerator>
176 first_nested_product_weight_tester(first_nested_product_generator);
177
178 typedef PowerWeight<FirstNestedProductWeight, 3> NestedProductCubeWeight;
179 typedef PowerWeightGenerator<FirstNestedProductWeightGenerator, 3>
180 NestedProductCubeWeightGenerator;
181
182 NestedProductCubeWeightGenerator nested_product_cube_generator(seed);
183 WeightTester<NestedProductCubeWeight, NestedProductCubeWeightGenerator>
184 nested_product_cube_weight_tester(nested_product_cube_generator);
185
186 typedef SparsePowerWeight<NestedProductCubeWeight,
187 size_t > SparseNestedProductCubeWeight;
188 typedef SparsePowerWeightGenerator<NestedProductCubeWeightGenerator,
189 size_t, 3> SparseNestedProductCubeWeightGenerator;
190
191 SparseNestedProductCubeWeightGenerator
192 sparse_nested_product_cube_generator(seed);
193 WeightTester<SparseNestedProductCubeWeight,
194 SparseNestedProductCubeWeightGenerator>
195 sparse_nested_product_cube_weight_tester(
196 sparse_nested_product_cube_generator);
197
198 typedef SparsePowerWeight<LogWeight, size_t > LogSparsePowerWeight;
199 typedef SparsePowerWeightGenerator<LogWeightGenerator,
200 size_t, 3> LogSparsePowerWeightGenerator;
201
202 LogSparsePowerWeightGenerator
203 log_sparse_power_weight_generator(seed);
204 WeightTester<LogSparsePowerWeight,
205 LogSparsePowerWeightGenerator>
206 log_sparse_power_weight_tester(
207 log_sparse_power_weight_generator);
208
209 typedef ExpectationWeight<LogWeight, LogWeight>
210 LogLogExpectWeight;
211 typedef ProductWeightGenerator<LogWeightGenerator, LogWeightGenerator,
212 LogLogExpectWeight> LogLogExpectWeightGenerator;
213
214 LogLogExpectWeightGenerator log_log_expect_weight_generator(seed);
215 WeightTester<LogLogExpectWeight, LogLogExpectWeightGenerator>
216 log_log_expect_weight_tester(log_log_expect_weight_generator);
217
218 typedef ExpectationWeight<LogWeight, LogSparsePowerWeight>
219 LogLogSparseExpectWeight;
220 typedef ProductWeightGenerator<
221 LogWeightGenerator,
222 LogSparsePowerWeightGenerator,
223 LogLogSparseExpectWeight> LogLogSparseExpectWeightGenerator;
224
225 LogLogSparseExpectWeightGenerator log_logsparse_expect_weight_generator(seed);
226 WeightTester<LogLogSparseExpectWeight, LogLogSparseExpectWeightGenerator>
227 log_logsparse_expect_weight_tester(log_logsparse_expect_weight_generator);
228
229 // Test all product weight I/O with parentheses
230 FLAGS_fst_weight_parentheses = "()";
231 first_nested_product_weight_tester.Test(FLAGS_repeat);
232 nested_product_cube_weight_tester.Test(FLAGS_repeat);
233 log_sparse_power_weight_tester.Test(1);
234 sparse_nested_product_cube_weight_tester.Test(1);
235 tropical_product_weight_tester.Test(5);
236 second_nested_product_weight_tester.Test(5);
237 tropical_gallic_tester.Test(5);
238 tropical_cube_weight_tester.Test(5);
239 FLAGS_fst_weight_parentheses = "";
240 log_sparse_power_weight_tester.Test(1);
241 log_log_expect_weight_tester.Test(1, false); // disables division
242 log_logsparse_expect_weight_tester.Test(1, false);
243
244 typedef LexicographicWeight<TropicalWeight, TropicalWeight>
245 TropicalLexicographicWeight;
246 typedef LexicographicWeightGenerator<TropicalWeightGenerator,
247 TropicalWeightGenerator> TropicalLexicographicWeightGenerator;
248
249 TropicalLexicographicWeightGenerator tropical_lexicographic_generator(seed);
250 WeightTester<TropicalLexicographicWeight,
251 TropicalLexicographicWeightGenerator>
252 tropical_lexicographic_tester(tropical_lexicographic_generator);
253 tropical_lexicographic_tester.Test(FLAGS_repeat);
254
255 cout << "PASS" << endl;
256
257 return 0;
258 }
259