37 DEFINE_int32(repeat, 10000,
"number of test repetitions");
72 void TestTemplatedWeights(uint64_t seed,
int repeat) {
73 WeightGenerate<TropicalWeightTpl<T>> tropical_generate(seed);
74 WeightTester<TropicalWeightTpl<T>> tropical_tester(tropical_generate);
75 tropical_tester.Test(repeat);
77 WeightGenerate<LogWeightTpl<T>> log_generate(seed);
78 WeightTester<LogWeightTpl<T>> log_tester(log_generate);
79 log_tester.Test(repeat);
81 WeightGenerate<RealWeightTpl<T>> real_generate(seed);
82 WeightTester<RealWeightTpl<T>> real_tester(real_generate);
83 real_tester.Test(repeat);
85 WeightGenerate<MinMaxWeightTpl<T>> minmax_generate(seed,
true);
86 WeightTester<MinMaxWeightTpl<T>> minmax_tester(minmax_generate);
87 minmax_tester.Test(repeat);
89 WeightGenerate<SignedLogWeightTpl<T>> signedlog_generate(seed,
true);
90 WeightTester<SignedLogWeightTpl<T>> signedlog_tester(signedlog_generate);
91 signedlog_tester.Test(repeat);
94 template <
class Weight>
95 void TestAdder(
int n) {
96 Weight sum = Weight::Zero();
98 for (
int i = 0; i < n; ++i) {
99 sum =
Plus(sum, Weight::One());
100 adder.Add(Weight::One());
105 template <
class Weight>
106 void TestSignedAdder(
int n) {
107 Weight sum = Weight::Zero();
109 const Weight minus_one =
Minus(Weight::Zero(), Weight::One());
110 for (
int i = 0; i < n; ++i) {
111 if (i < n / 4 || i > 3 * n / 4) {
112 sum =
Plus(sum, Weight::One());
113 adder.Add(Weight::One());
115 sum =
Minus(sum, Weight::One());
116 adder.Add(minus_one);
122 template <
typename Weight1,
typename Weight2>
123 void TestWeightConversion(Weight1 w1) {
125 const WeightConvert<Weight2, Weight1> to_w1_;
126 const WeightConvert<Weight1, Weight2> to_w2_;
127 Weight2 w2 = to_w2_(w1);
128 Weight1 nw1 = to_w1_(w2);
132 template <
typename FromWeight,
typename ToWeight>
133 void TestWeightCopy(FromWeight w) {
135 const ToWeight to_copied(w);
136 const FromWeight roundtrip_copied(to_copied);
140 ToWeight to_copy_assigned;
141 to_copy_assigned = w;
142 CHECK_EQ(to_copied, to_copy_assigned);
144 FromWeight roundtrip_copy_assigned;
145 roundtrip_copy_assigned = to_copy_assigned;
146 CHECK_EQ(w, roundtrip_copy_assigned);
149 template <
typename FromWeight,
typename ToWeight>
150 void TestWeightMove(FromWeight w) {
152 const FromWeight orig(w);
153 ToWeight to_moved(std::move(w));
154 const FromWeight roundtrip_moved(std::move(to_moved));
159 ToWeight to_move_assigned;
160 to_move_assigned = std::move(w);
161 FromWeight roundtrip_move_assigned;
162 roundtrip_move_assigned = std::move(to_move_assigned);
163 CHECK_EQ(orig, roundtrip_move_assigned);
166 template <
class Weight>
167 void TestImplicitConversion() {
170 CHECK(Weight(2.0f) == 2.0f);
171 CHECK(Weight(2.0) == 2.0);
172 CHECK(2.0f == Weight(2.0f));
173 CHECK(2.0 == Weight(2.0));
184 void TestPowerWeightGetSetValue() {
185 PowerWeight<LogWeight, 3> w;
193 void TestSparsePowerWeightGetSetValue() {
195 SparsePowerWeight<LogWeight> w;
196 w.SetDefaultValue(default_value);
199 CHECK_EQ(default_value, w.Value(0));
200 CHECK_EQ(default_value, w.Value(100));
238 w.SetValue(30, default_value);
239 CHECK_EQ(default_value, w.Value(30));
243 w.SetValue(5, default_value);
244 CHECK_EQ(default_value, w.Value(5));
248 w.SetValue(31, default_value);
249 w.SetValue(29, default_value);
250 w.SetValue(10, default_value);
253 CHECK_EQ(default_value, w.Value(5));
254 CHECK_EQ(default_value, w.Value(10));
255 CHECK_EQ(default_value, w.Value(29));
256 CHECK_EQ(default_value, w.Value(30));
257 CHECK_EQ(default_value, w.Value(31));
264 bool FloatEqualityIsReflexive(T m) {
268 volatile T x = 1.111;
277 void TestFloatEqualityIsReflexive() {
280 volatile double test_value = 1.1;
281 CHECK(FloatEqualityIsReflexive(static_cast<float>(test_value)));
282 CHECK(FloatEqualityIsReflexive(test_value));
287 int main(
int argc,
char **argv) {
291 TestTemplatedWeights<float>(FST_FLAGS_seed,
293 TestTemplatedWeights<double>(FST_FLAGS_seed,
295 SetFlag(&FST_FLAGS_fst_weight_parentheses,
"()");
296 TestTemplatedWeights<float>(FST_FLAGS_seed,
298 TestTemplatedWeights<double>(FST_FLAGS_seed,
300 SetFlag(&FST_FLAGS_fst_weight_parentheses,
"");
303 CHECK_EQ(TropicalWeight::Type(),
"tropical");
304 CHECK(TropicalWeightTpl<double>::Type() != TropicalWeightTpl<float>::Type());
306 CHECK(LogWeightTpl<double>::Type() != LogWeightTpl<float>::Type());
307 CHECK_EQ(RealWeight::Type(),
"real");
308 CHECK(RealWeightTpl<double>::Type() != RealWeightTpl<float>::Type());
309 TropicalWeightTpl<double> w(2.0);
313 TestAdder<TropicalWeight>(1000);
314 TestAdder<LogWeight>(1000);
315 TestAdder<RealWeight>(1000);
316 TestSignedAdder<SignedLogWeight>(1000);
318 TestImplicitConversion<TropicalWeight>();
319 TestImplicitConversion<LogWeight>();
320 TestImplicitConversion<RealWeight>();
321 TestImplicitConversion<MinMaxWeight>();
323 TestWeightConversion<TropicalWeight, LogWeight>(2.0);
325 using LeftStringWeight = StringWeight<int>;
326 WeightGenerate<LeftStringWeight> left_string_generate(
328 WeightTester<LeftStringWeight> left_string_tester(left_string_generate);
329 left_string_tester.Test(FST_FLAGS_repeat);
331 using RightStringWeight = StringWeight<int, STRING_RIGHT>;
332 WeightGenerate<RightStringWeight> right_string_generate(
334 WeightTester<RightStringWeight> right_string_tester(right_string_generate);
335 right_string_tester.Test(FST_FLAGS_repeat);
340 using IUSetWeight = SetWeight<int, SET_INTERSECT_UNION>;
341 WeightGenerate<IUSetWeight> iu_set_generate(FST_FLAGS_seed);
342 WeightTester<IUSetWeight> iu_set_tester(iu_set_generate);
343 iu_set_tester.Test(FST_FLAGS_repeat);
345 using UISetWeight = SetWeight<int, SET_UNION_INTERSECT>;
346 WeightGenerate<UISetWeight> ui_set_generate(FST_FLAGS_seed);
347 WeightTester<UISetWeight> ui_set_tester(ui_set_generate);
348 ui_set_tester.Test(FST_FLAGS_repeat);
353 using BoolSetWeight = SetWeight<int, SET_BOOLEAN>;
354 WeightGenerate<BoolSetWeight> bool_set_generate(FST_FLAGS_seed);
355 WeightTester<BoolSetWeight> bool_set_tester(bool_set_generate);
356 bool_set_tester.Test(FST_FLAGS_repeat);
358 TestWeightConversion<IUSetWeight, UISetWeight>(iu_set_generate());
360 TestWeightCopy<IUSetWeight, UISetWeight>(iu_set_generate());
361 TestWeightCopy<IUSetWeight, BoolSetWeight>(iu_set_generate());
362 TestWeightCopy<UISetWeight, IUSetWeight>(ui_set_generate());
363 TestWeightCopy<UISetWeight, BoolSetWeight>(ui_set_generate());
364 TestWeightCopy<BoolSetWeight, IUSetWeight>(bool_set_generate());
365 TestWeightCopy<BoolSetWeight, UISetWeight>(bool_set_generate());
367 TestWeightMove<IUSetWeight, UISetWeight>(iu_set_generate());
368 TestWeightMove<IUSetWeight, BoolSetWeight>(iu_set_generate());
369 TestWeightMove<UISetWeight, IUSetWeight>(ui_set_generate());
370 TestWeightMove<UISetWeight, BoolSetWeight>(ui_set_generate());
371 TestWeightMove<BoolSetWeight, IUSetWeight>(bool_set_generate());
372 TestWeightMove<BoolSetWeight, UISetWeight>(bool_set_generate());
376 using TropicalGallicWeight = GallicWeight<int, TropicalWeight>;
377 WeightGenerate<TropicalGallicWeight> tropical_gallic_generate(
378 FST_FLAGS_seed,
true);
379 WeightTester<TropicalGallicWeight> tropical_gallic_tester(
380 tropical_gallic_generate);
382 using TropicalGenGallicWeight = GallicWeight<int, TropicalWeight, GALLIC>;
383 WeightGenerate<TropicalGenGallicWeight> tropical_gen_gallic_generate(
384 FST_FLAGS_seed,
false);
385 WeightTester<TropicalGenGallicWeight> tropical_gen_gallic_tester(
386 tropical_gen_gallic_generate);
388 using TropicalProductWeight = ProductWeight<TropicalWeight, TropicalWeight>;
389 WeightGenerate<TropicalProductWeight> tropical_product_generate(
391 WeightTester<TropicalProductWeight> tropical_product_tester(
392 tropical_product_generate);
394 using TropicalLexicographicWeight =
395 LexicographicWeight<TropicalWeight, TropicalWeight>;
396 WeightGenerate<TropicalLexicographicWeight> tropical_lexicographic_generate(
398 WeightTester<TropicalLexicographicWeight> tropical_lexicographic_tester(
399 tropical_lexicographic_generate);
401 using TropicalCubeWeight = PowerWeight<TropicalWeight, 3>;
402 WeightGenerate<TropicalCubeWeight> tropical_cube_generate(
404 WeightTester<TropicalCubeWeight> tropical_cube_tester(tropical_cube_generate);
406 using FirstNestedProductWeight =
407 ProductWeight<TropicalProductWeight, TropicalWeight>;
408 WeightGenerate<FirstNestedProductWeight> first_nested_product_generate(
410 WeightTester<FirstNestedProductWeight> first_nested_product_tester(
411 first_nested_product_generate);
413 using SecondNestedProductWeight =
414 ProductWeight<TropicalWeight, TropicalProductWeight>;
415 WeightGenerate<SecondNestedProductWeight> second_nested_product_generate(
417 WeightTester<SecondNestedProductWeight> second_nested_product_tester(
418 second_nested_product_generate);
420 using NestedProductCubeWeight = PowerWeight<FirstNestedProductWeight, 3>;
421 WeightGenerate<NestedProductCubeWeight> nested_product_cube_generate(
423 WeightTester<NestedProductCubeWeight> nested_product_cube_tester(
424 nested_product_cube_generate);
426 using SparseNestedProductCubeWeight =
427 SparsePowerWeight<NestedProductCubeWeight, size_t>;
428 WeightGenerate<SparseNestedProductCubeWeight>
429 sparse_nested_product_cube_generate(FST_FLAGS_seed);
430 WeightTester<SparseNestedProductCubeWeight> sparse_nested_product_cube_tester(
431 sparse_nested_product_cube_generate);
433 using LogSparsePowerWeight = SparsePowerWeight<LogWeight, size_t>;
434 WeightGenerate<LogSparsePowerWeight> log_sparse_power_generate(
436 WeightTester<LogSparsePowerWeight> log_sparse_power_tester(
437 log_sparse_power_generate);
439 using LogLogExpectationWeight = ExpectationWeight<LogWeight, LogWeight>;
440 WeightGenerate<LogLogExpectationWeight> log_log_expectation_generate(
442 WeightTester<LogLogExpectationWeight> log_log_expectation_tester(
443 log_log_expectation_generate);
445 using RealRealExpectationWeight = ExpectationWeight<RealWeight, RealWeight>;
446 WeightGenerate<RealRealExpectationWeight> real_real_expectation_generate(
448 WeightTester<RealRealExpectationWeight> real_real_expectation_tester(
449 real_real_expectation_generate);
451 using LogLogSparseExpectationWeight =
452 ExpectationWeight<LogWeight, LogSparsePowerWeight>;
453 WeightGenerate<LogLogSparseExpectationWeight>
454 log_log_sparse_expectation_generate(FST_FLAGS_seed);
455 WeightTester<LogLogSparseExpectationWeight> log_log_sparse_expectation_tester(
456 log_log_sparse_expectation_generate);
458 struct UnionWeightOptions {
459 using Compare = NaturalLess<TropicalWeight>;
468 using ReverseOptions = UnionWeightOptions;
471 using TropicalUnionWeight = UnionWeight<TropicalWeight, UnionWeightOptions>;
472 WeightGenerate<TropicalUnionWeight> tropical_union_generate(
474 WeightTester<TropicalUnionWeight> tropical_union_tester(
475 tropical_union_generate);
480 SetFlag(&FST_FLAGS_fst_weight_parentheses,
"()");
483 tropical_gallic_tester.Test(FST_FLAGS_repeat);
484 tropical_gen_gallic_tester.Test(FST_FLAGS_repeat);
485 tropical_product_tester.Test(FST_FLAGS_repeat);
486 tropical_lexicographic_tester.Test(FST_FLAGS_repeat);
487 tropical_cube_tester.Test(FST_FLAGS_repeat);
488 log_sparse_power_tester.Test(FST_FLAGS_repeat);
489 log_log_expectation_tester.Test(FST_FLAGS_repeat);
490 real_real_expectation_tester.Test(FST_FLAGS_repeat);
491 tropical_union_tester.Test(FST_FLAGS_repeat);
494 first_nested_product_tester.Test(FST_FLAGS_repeat);
495 second_nested_product_tester.Test(5);
496 nested_product_cube_tester.Test(FST_FLAGS_repeat);
497 sparse_nested_product_cube_tester.Test(FST_FLAGS_repeat);
498 log_log_sparse_expectation_tester.Test(FST_FLAGS_repeat);
501 SetFlag(&FST_FLAGS_fst_weight_parentheses,
"");
504 tropical_gallic_tester.Test(FST_FLAGS_repeat);
505 tropical_product_tester.Test(FST_FLAGS_repeat);
506 tropical_lexicographic_tester.Test(FST_FLAGS_repeat);
507 tropical_cube_tester.Test(FST_FLAGS_repeat);
508 log_sparse_power_tester.Test(FST_FLAGS_repeat);
509 log_log_expectation_tester.Test(FST_FLAGS_repeat);
510 tropical_union_tester.Test(FST_FLAGS_repeat);
513 second_nested_product_tester.Test(FST_FLAGS_repeat);
514 log_log_sparse_expectation_tester.Test(FST_FLAGS_repeat);
516 TestPowerWeightGetSetValue();
517 TestSparsePowerWeightGetSetValue();
519 TestFloatEqualityIsReflexive();
RealWeightTpl< float > RealWeight
ErrorWeight Plus(const ErrorWeight &, const ErrorWeight &)
DEFINE_int32(repeat, 10000,"number of test repetitions")
ErrorWeight Times(const ErrorWeight &, const ErrorWeight &)
int main(int argc, char **argv)
#define SET_FLAGS(usage, argc, argv, rmflags)
LogWeightTpl< float > LogWeight
TropicalWeightTpl< float > TropicalWeight
MinMaxWeightTpl< float > MinMaxWeight
LogWeightTpl< T > Minus(const LogWeightTpl< T > &w1, const LogWeightTpl< T > &w2)
DEFINE_uint64(seed, 403,"random seed")
void SetFlag(Type *flag, Value value)
SignedLogWeightTpl< float > SignedLogWeight
bool ApproxEqual(const ErrorWeight &, const ErrorWeight &, float)