• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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