1 // algo_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 various FST algorithms.
20
21 #include "./algo_test.h"
22
23 // These determine which semirings are tested. Defining at least
24 // TEST_TROPICAL and TEST_LOG is recommended. More increase the
25 // comprehensiveness, but also increase the compilation time.
26
27 #define TEST_TROPICAL
28 #define TEST_LOG
29 // #define TEST_MINMAX
30 // #define TEST_LEFT_STRING
31 // #define TEST_RIGHT_STRING
32 // #define TEST_GALLIC
33 // #define TEST_LEXICOGRAPHIC
34 // #define TEST_POWER
35
36 DEFINE_int32(seed, -1, "random seed");
37 DEFINE_int32(repeat, 25, "number of test repetitions");
38
39 using fst::StdArc;
40 using fst::TropicalWeightGenerator;
41
42 using fst::LogArc;
43 using fst::LogWeightGenerator;
44
45 using fst::MinMaxArc;
46 using fst::MinMaxWeightGenerator;
47
48 using fst::StringArc;
49 using fst::StringWeightGenerator;
50 using fst::STRING_LEFT;
51 using fst::STRING_RIGHT;
52
53 using fst::GallicArc;
54 using fst::GallicWeightGenerator;
55
56 using fst::LexicographicArc;
57 using fst::TropicalWeight;
58 using fst::LexicographicWeightGenerator;
59
60 using fst::ArcTpl;
61 using fst::PowerWeight;
62 using fst::PowerWeightGenerator;
63
64 using fst::AlgoTester;
65
main(int argc,char ** argv)66 int main(int argc, char **argv) {
67 FLAGS_fst_verify_properties = true;
68 std::set_new_handler(FailedNewHandler);
69 SET_FLAGS(argv[0], &argc, &argv, true);
70
71 static const int kCacheGcLimit = 20;
72
73 int seed = FLAGS_seed >= 0 ? FLAGS_seed : time(0);
74 srand(seed);
75 LOG(INFO) << "Seed = " << seed;
76
77 FLAGS_fst_default_cache_gc = rand() % 2;
78 FLAGS_fst_default_cache_gc_limit = rand() % kCacheGcLimit;
79 VLOG(1) << "default_cache_gc:" << FLAGS_fst_default_cache_gc;
80 VLOG(1) << "default_cache_gc_limit:" << FLAGS_fst_default_cache_gc_limit;
81
82 #ifdef TEST_TROPICAL
83 TropicalWeightGenerator tropical_generator(seed, false);
84 AlgoTester<StdArc, TropicalWeightGenerator>
85 tropical_tester(tropical_generator, seed);
86 tropical_tester.Test();
87 #endif // TEST_TROPICAL
88
89 #ifdef TEST_LOG
90 LogWeightGenerator log_generator(seed, false);
91 AlgoTester<LogArc, LogWeightGenerator>
92 log_tester(log_generator, seed);
93 log_tester.Test();
94 #endif // TEST_LOG
95
96 #ifdef TEST_MINMAX
97 MinMaxWeightGenerator minmax_generator(seed, false);
98 AlgoTester<MinMaxArc, MinMaxWeightGenerator>
99 minmax_tester(minmax_generator, seed);
100 minmax_tester.Test();
101 #endif
102
103 #ifdef TEST_LEFT_STRING
104 StringWeightGenerator<int> left_string_generator(seed, false);
105 AlgoTester<StringArc<>, StringWeightGenerator<int> >
106 left_string_tester(left_string_generator, seed);
107 left_string_tester.Test();
108 #endif // TEST_LEFT_STRING
109
110 #ifdef TEST_RIGHT_STRING
111 StringWeightGenerator<int, STRING_RIGHT> right_string_generator(seed, false);
112 AlgoTester<StringArc<STRING_RIGHT>,
113 StringWeightGenerator<int, STRING_RIGHT> >
114 right_string_tester(right_string_generator, seed);
115 right_string_tester.Test();
116 #endif // TEST_RIGHT_STRING
117
118 #ifdef TEST_GALLIC
119 typedef GallicArc<StdArc> StdGallicArc;
120 typedef GallicWeightGenerator<int, TropicalWeightGenerator>
121 TropicalGallicWeightGenerator;
122
123 TropicalGallicWeightGenerator tropical_gallic_generator(seed, false);
124 AlgoTester<StdGallicArc, TropicalGallicWeightGenerator>
125 gallic_tester(tropical_gallic_generator, seed);
126 gallic_tester.Test();
127 #endif // TEST_GALLIC
128
129 #ifdef TEST_LEXICOGRAPHIC
130 typedef LexicographicArc<TropicalWeight, TropicalWeight>
131 TropicalLexicographicArc;
132 typedef LexicographicWeightGenerator<TropicalWeightGenerator,
133 TropicalWeightGenerator> TropicalLexicographicWeightGenerator;
134 TropicalLexicographicWeightGenerator lexicographic_generator(seed, false);
135 AlgoTester<TropicalLexicographicArc, TropicalLexicographicWeightGenerator>
136 lexicographic_tester(lexicographic_generator, seed);
137 lexicographic_tester.Test();
138 #endif // TEST_LEXICOGRAPHIC
139
140 #ifdef TEST_POWER
141 typedef PowerWeight<TropicalWeight, 3> TropicalCubeWeight;
142 typedef ArcTpl<TropicalCubeWeight> TropicalCubeArc;
143 typedef PowerWeightGenerator<TropicalWeightGenerator, 3>
144 TropicalCubeWeightGenerator;
145
146 TropicalCubeWeightGenerator tropical_cube_generator(seed, false);
147 AlgoTester<TropicalCubeArc, TropicalCubeWeightGenerator>
148 tropical_cube_tester(tropical_cube_generator, seed);
149 tropical_cube_tester.Test();
150 #endif // TEST_POWER
151
152 cout << "PASS" << endl;
153
154 return 0;
155 }
156