// weight_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 Fst weights.

#include <cstdlib>
#include <ctime>

#include <fst/expectation-weight.h>
#include <fst/float-weight.h>
#include <fst/random-weight.h>
#include "./weight-tester.h"

DEFINE_int32(seed, -1, "random seed");
DEFINE_int32(repeat, 100000, "number of test repetitions");

using fst::TropicalWeight;
using fst::TropicalWeightGenerator;
using fst::TropicalWeightTpl;
using fst::TropicalWeightGenerator_;

using fst::LogWeight;
using fst::LogWeightGenerator;
using fst::LogWeightTpl;
using fst::LogWeightGenerator_;

using fst::MinMaxWeight;
using fst::MinMaxWeightGenerator;
using fst::MinMaxWeightTpl;
using fst::MinMaxWeightGenerator_;

using fst::StringWeight;
using fst::StringWeightGenerator;

using fst::GallicWeight;
using fst::GallicWeightGenerator;

using fst::LexicographicWeight;
using fst::LexicographicWeightGenerator;

using fst::ProductWeight;
using fst::ProductWeightGenerator;

using fst::PowerWeight;
using fst::PowerWeightGenerator;

using fst::SignedLogWeightTpl;
using fst::SignedLogWeightGenerator_;

using fst::ExpectationWeight;

using fst::SparsePowerWeight;
using fst::SparsePowerWeightGenerator;

using fst::STRING_LEFT;
using fst::STRING_RIGHT;

using fst::WeightTester;

template <class T>
void TestTemplatedWeights(int repeat, int seed) {
  TropicalWeightGenerator_<T> tropical_generator(seed);
  WeightTester<TropicalWeightTpl<T>, TropicalWeightGenerator_<T> >
      tropical_tester(tropical_generator);
  tropical_tester.Test(repeat);

  LogWeightGenerator_<T> log_generator(seed);
  WeightTester<LogWeightTpl<T>, LogWeightGenerator_<T> >
      log_tester(log_generator);
  log_tester.Test(repeat);

  MinMaxWeightGenerator_<T> minmax_generator(seed);
  WeightTester<MinMaxWeightTpl<T>, MinMaxWeightGenerator_<T> >
      minmax_tester(minmax_generator);
  minmax_tester.Test(repeat);

  SignedLogWeightGenerator_<T> signedlog_generator(seed);
  WeightTester<SignedLogWeightTpl<T>, SignedLogWeightGenerator_<T> >
      signedlog_tester(signedlog_generator);
  signedlog_tester.Test(repeat);
}

int main(int argc, char **argv) {
  std::set_new_handler(FailedNewHandler);
  SetFlags(argv[0], &argc, &argv, true);

  int seed = FLAGS_seed >= 0 ? FLAGS_seed : time(0);
  LOG(INFO) << "Seed = " << seed;

  TestTemplatedWeights<float>(FLAGS_repeat, seed);
  TestTemplatedWeights<double>(FLAGS_repeat, seed);
  FLAGS_fst_weight_parentheses = "()";
  TestTemplatedWeights<float>(FLAGS_repeat, seed);
  TestTemplatedWeights<double>(FLAGS_repeat, seed);
  FLAGS_fst_weight_parentheses = "";

  // Make sure type names for templated weights are consistent
  CHECK(TropicalWeight::Type() == "tropical");
  CHECK(TropicalWeightTpl<double>::Type() != TropicalWeightTpl<float>::Type());
  CHECK(LogWeight::Type() == "log");
  CHECK(LogWeightTpl<double>::Type() != LogWeightTpl<float>::Type());
  TropicalWeightTpl<double> w(15.0);
  TropicalWeight tw(15.0);

  StringWeightGenerator<int> left_string_generator(seed);
  WeightTester<StringWeight<int>, StringWeightGenerator<int> >
    left_string_tester(left_string_generator);
  left_string_tester.Test(FLAGS_repeat);

  StringWeightGenerator<int, STRING_RIGHT> right_string_generator(seed);
  WeightTester<StringWeight<int, STRING_RIGHT>,
    StringWeightGenerator<int, STRING_RIGHT> >
    right_string_tester(right_string_generator);
  right_string_tester.Test(FLAGS_repeat);

  typedef GallicWeight<int, TropicalWeight> TropicalGallicWeight;
  typedef GallicWeightGenerator<int, TropicalWeightGenerator>
    TropicalGallicWeightGenerator;

  TropicalGallicWeightGenerator tropical_gallic_generator(seed);
  WeightTester<TropicalGallicWeight, TropicalGallicWeightGenerator>
    tropical_gallic_tester(tropical_gallic_generator);
  tropical_gallic_tester.Test(FLAGS_repeat);

  typedef ProductWeight<TropicalWeight, TropicalWeight> TropicalProductWeight;
  typedef ProductWeightGenerator<TropicalWeightGenerator,
      TropicalWeightGenerator> TropicalProductWeightGenerator;

  TropicalProductWeightGenerator tropical_product_generator(seed);
  WeightTester<TropicalProductWeight, TropicalProductWeightGenerator>
      tropical_product_weight_tester(tropical_product_generator);
  tropical_product_weight_tester.Test(FLAGS_repeat);

  typedef PowerWeight<TropicalWeight, 3> TropicalCubeWeight;
  typedef PowerWeightGenerator<TropicalWeightGenerator, 3>
      TropicalCubeWeightGenerator;

  TropicalCubeWeightGenerator tropical_cube_generator(seed);
  WeightTester<TropicalCubeWeight, TropicalCubeWeightGenerator>
      tropical_cube_weight_tester(tropical_cube_generator);
  tropical_cube_weight_tester.Test(FLAGS_repeat);

  typedef ProductWeight<TropicalWeight, TropicalProductWeight>
      SecondNestedProductWeight;
  typedef ProductWeightGenerator<TropicalWeightGenerator,
      TropicalProductWeightGenerator> SecondNestedProductWeightGenerator;

  SecondNestedProductWeightGenerator second_nested_product_generator(seed);
  WeightTester<SecondNestedProductWeight, SecondNestedProductWeightGenerator>
      second_nested_product_weight_tester(second_nested_product_generator);
  second_nested_product_weight_tester.Test(FLAGS_repeat);

  // This only works with fst_weight_parentheses = "()"
  typedef ProductWeight<TropicalProductWeight, TropicalWeight>
      FirstNestedProductWeight;
  typedef ProductWeightGenerator<TropicalProductWeightGenerator,
      TropicalWeightGenerator> FirstNestedProductWeightGenerator;

  FirstNestedProductWeightGenerator first_nested_product_generator(seed);
  WeightTester<FirstNestedProductWeight, FirstNestedProductWeightGenerator>
      first_nested_product_weight_tester(first_nested_product_generator);

  typedef PowerWeight<FirstNestedProductWeight, 3> NestedProductCubeWeight;
  typedef PowerWeightGenerator<FirstNestedProductWeightGenerator, 3>
      NestedProductCubeWeightGenerator;

  NestedProductCubeWeightGenerator nested_product_cube_generator(seed);
  WeightTester<NestedProductCubeWeight, NestedProductCubeWeightGenerator>
      nested_product_cube_weight_tester(nested_product_cube_generator);

  typedef SparsePowerWeight<NestedProductCubeWeight,
      size_t > SparseNestedProductCubeWeight;
  typedef SparsePowerWeightGenerator<NestedProductCubeWeightGenerator,
      size_t, 3> SparseNestedProductCubeWeightGenerator;

  SparseNestedProductCubeWeightGenerator
      sparse_nested_product_cube_generator(seed);
  WeightTester<SparseNestedProductCubeWeight,
      SparseNestedProductCubeWeightGenerator>
      sparse_nested_product_cube_weight_tester(
          sparse_nested_product_cube_generator);

  typedef SparsePowerWeight<LogWeight, size_t > LogSparsePowerWeight;
  typedef SparsePowerWeightGenerator<LogWeightGenerator,
      size_t, 3> LogSparsePowerWeightGenerator;

  LogSparsePowerWeightGenerator
      log_sparse_power_weight_generator(seed);
  WeightTester<LogSparsePowerWeight,
      LogSparsePowerWeightGenerator>
      log_sparse_power_weight_tester(
          log_sparse_power_weight_generator);

  typedef ExpectationWeight<LogWeight, LogWeight>
      LogLogExpectWeight;
  typedef ProductWeightGenerator<LogWeightGenerator, LogWeightGenerator,
    LogLogExpectWeight> LogLogExpectWeightGenerator;

  LogLogExpectWeightGenerator log_log_expect_weight_generator(seed);
  WeightTester<LogLogExpectWeight, LogLogExpectWeightGenerator>
      log_log_expect_weight_tester(log_log_expect_weight_generator);

  typedef ExpectationWeight<LogWeight, LogSparsePowerWeight>
      LogLogSparseExpectWeight;
  typedef ProductWeightGenerator<
    LogWeightGenerator,
    LogSparsePowerWeightGenerator,
    LogLogSparseExpectWeight> LogLogSparseExpectWeightGenerator;

  LogLogSparseExpectWeightGenerator log_logsparse_expect_weight_generator(seed);
  WeightTester<LogLogSparseExpectWeight, LogLogSparseExpectWeightGenerator>
      log_logsparse_expect_weight_tester(log_logsparse_expect_weight_generator);

  // Test all product weight I/O with parentheses
  FLAGS_fst_weight_parentheses = "()";
  first_nested_product_weight_tester.Test(FLAGS_repeat);
  nested_product_cube_weight_tester.Test(FLAGS_repeat);
  log_sparse_power_weight_tester.Test(1);
  sparse_nested_product_cube_weight_tester.Test(1);
  tropical_product_weight_tester.Test(5);
  second_nested_product_weight_tester.Test(5);
  tropical_gallic_tester.Test(5);
  tropical_cube_weight_tester.Test(5);
  FLAGS_fst_weight_parentheses = "";
  log_sparse_power_weight_tester.Test(1);
  log_log_expect_weight_tester.Test(1, false); // disables division
  log_logsparse_expect_weight_tester.Test(1, false);

  typedef LexicographicWeight<TropicalWeight, TropicalWeight>
      TropicalLexicographicWeight;
  typedef LexicographicWeightGenerator<TropicalWeightGenerator,
      TropicalWeightGenerator> TropicalLexicographicWeightGenerator;

  TropicalLexicographicWeightGenerator tropical_lexicographic_generator(seed);
  WeightTester<TropicalLexicographicWeight,
      TropicalLexicographicWeightGenerator>
    tropical_lexicographic_tester(tropical_lexicographic_generator);
  tropical_lexicographic_tester.Test(FLAGS_repeat);

  cout << "PASS" << endl;

  return 0;
}
