// algo_test.h // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // Copyright 2005-2010 Google, Inc. // Author: riley@google.com (Michael Riley) // // \file // Regression test for various FST algorithms. #include "./algo_test.h" // These determine which semirings are tested. Defining at least // TEST_TROPICAL and TEST_LOG is recommended. More increase the // comprehensiveness, but also increase the compilation time. #define TEST_TROPICAL #define TEST_LOG // #define TEST_MINMAX // #define TEST_LEFT_STRING // #define TEST_RIGHT_STRING // #define TEST_GALLIC // #define TEST_LEXICOGRAPHIC // #define TEST_POWER DEFINE_int32(seed, -1, "random seed"); DEFINE_int32(repeat, 25, "number of test repetitions"); using fst::StdArc; using fst::TropicalWeightGenerator; using fst::LogArc; using fst::LogWeightGenerator; using fst::MinMaxArc; using fst::MinMaxWeightGenerator; using fst::StringArc; using fst::StringWeightGenerator; using fst::STRING_LEFT; using fst::STRING_RIGHT; using fst::GallicArc; using fst::GallicWeightGenerator; using fst::LexicographicArc; using fst::TropicalWeight; using fst::LexicographicWeightGenerator; using fst::ArcTpl; using fst::PowerWeight; using fst::PowerWeightGenerator; using fst::AlgoTester; int main(int argc, char **argv) { FLAGS_fst_verify_properties = true; std::set_new_handler(FailedNewHandler); SET_FLAGS(argv[0], &argc, &argv, true); static const int kCacheGcLimit = 20; int seed = FLAGS_seed >= 0 ? FLAGS_seed : time(0); srand(seed); LOG(INFO) << "Seed = " << seed; FLAGS_fst_default_cache_gc = rand() % 2; FLAGS_fst_default_cache_gc_limit = rand() % kCacheGcLimit; VLOG(1) << "default_cache_gc:" << FLAGS_fst_default_cache_gc; VLOG(1) << "default_cache_gc_limit:" << FLAGS_fst_default_cache_gc_limit; #ifdef TEST_TROPICAL TropicalWeightGenerator tropical_generator(seed, false); AlgoTester<StdArc, TropicalWeightGenerator> tropical_tester(tropical_generator, seed); tropical_tester.Test(); #endif // TEST_TROPICAL #ifdef TEST_LOG LogWeightGenerator log_generator(seed, false); AlgoTester<LogArc, LogWeightGenerator> log_tester(log_generator, seed); log_tester.Test(); #endif // TEST_LOG #ifdef TEST_MINMAX MinMaxWeightGenerator minmax_generator(seed, false); AlgoTester<MinMaxArc, MinMaxWeightGenerator> minmax_tester(minmax_generator, seed); minmax_tester.Test(); #endif #ifdef TEST_LEFT_STRING StringWeightGenerator<int> left_string_generator(seed, false); AlgoTester<StringArc<>, StringWeightGenerator<int> > left_string_tester(left_string_generator, seed); left_string_tester.Test(); #endif // TEST_LEFT_STRING #ifdef TEST_RIGHT_STRING StringWeightGenerator<int, STRING_RIGHT> right_string_generator(seed, false); AlgoTester<StringArc<STRING_RIGHT>, StringWeightGenerator<int, STRING_RIGHT> > right_string_tester(right_string_generator, seed); right_string_tester.Test(); #endif // TEST_RIGHT_STRING #ifdef TEST_GALLIC typedef GallicArc<StdArc> StdGallicArc; typedef GallicWeightGenerator<int, TropicalWeightGenerator> TropicalGallicWeightGenerator; TropicalGallicWeightGenerator tropical_gallic_generator(seed, false); AlgoTester<StdGallicArc, TropicalGallicWeightGenerator> gallic_tester(tropical_gallic_generator, seed); gallic_tester.Test(); #endif // TEST_GALLIC #ifdef TEST_LEXICOGRAPHIC typedef LexicographicArc<TropicalWeight, TropicalWeight> TropicalLexicographicArc; typedef LexicographicWeightGenerator<TropicalWeightGenerator, TropicalWeightGenerator> TropicalLexicographicWeightGenerator; TropicalLexicographicWeightGenerator lexicographic_generator(seed, false); AlgoTester<TropicalLexicographicArc, TropicalLexicographicWeightGenerator> lexicographic_tester(lexicographic_generator, seed); lexicographic_tester.Test(); #endif // TEST_LEXICOGRAPHIC #ifdef TEST_POWER typedef PowerWeight<TropicalWeight, 3> TropicalCubeWeight; typedef ArcTpl<TropicalCubeWeight> TropicalCubeArc; typedef PowerWeightGenerator<TropicalWeightGenerator, 3> TropicalCubeWeightGenerator; TropicalCubeWeightGenerator tropical_cube_generator(seed, false); AlgoTester<TropicalCubeArc, TropicalCubeWeightGenerator> tropical_cube_tester(tropical_cube_generator, seed); tropical_cube_tester.Test(); #endif // TEST_POWER cout << "PASS" << endl; return 0; }