// Copyright 2017 The Abseil Authors.
//
// 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
//
//      https://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.

#include "absl/random/internal/chi_square.h"

#include <algorithm>
#include <cstddef>
#include <cstdint>
#include <iterator>
#include <numeric>
#include <vector>

#include "gtest/gtest.h"
#include "absl/algorithm/container.h"
#include "absl/base/macros.h"

using absl::random_internal::ChiSquare;
using absl::random_internal::ChiSquarePValue;
using absl::random_internal::ChiSquareValue;
using absl::random_internal::ChiSquareWithExpected;

namespace {

TEST(ChiSquare, Value) {
  struct {
    int line;
    double chi_square;
    int df;
    double confidence;
  } const specs[] = {
      // Testing lookup at 1% confidence
      {__LINE__, 0, 0, 0.01},
      {__LINE__, 0.00016, 1, 0.01},
      {__LINE__, 1.64650, 8, 0.01},
      {__LINE__, 5.81221, 16, 0.01},
      {__LINE__, 156.4319, 200, 0.01},
      {__LINE__, 1121.3784, 1234, 0.01},
      {__LINE__, 53557.1629, 54321, 0.01},
      {__LINE__, 651662.6647, 654321, 0.01},

      // Testing lookup at 99% confidence
      {__LINE__, 0, 0, 0.99},
      {__LINE__, 6.635, 1, 0.99},
      {__LINE__, 20.090, 8, 0.99},
      {__LINE__, 32.000, 16, 0.99},
      {__LINE__, 249.4456, 200, 0.99},
      {__LINE__, 1131.1573, 1023, 0.99},
      {__LINE__, 1352.5038, 1234, 0.99},
      {__LINE__, 55090.7356, 54321, 0.99},
      {__LINE__, 656985.1514, 654321, 0.99},

      // Testing lookup at 99.9% confidence
      {__LINE__, 16.2659, 3, 0.999},
      {__LINE__, 22.4580, 6, 0.999},
      {__LINE__, 267.5409, 200, 0.999},
      {__LINE__, 1168.5033, 1023, 0.999},
      {__LINE__, 55345.1741, 54321, 0.999},
      {__LINE__, 657861.7284, 654321, 0.999},
      {__LINE__, 51.1772, 24, 0.999},
      {__LINE__, 59.7003, 30, 0.999},
      {__LINE__, 37.6984, 15, 0.999},
      {__LINE__, 29.5898, 10, 0.999},
      {__LINE__, 27.8776, 9, 0.999},

      // Testing lookup at random confidences
      {__LINE__, 0.000157088, 1, 0.01},
      {__LINE__, 5.31852, 2, 0.93},
      {__LINE__, 1.92256, 4, 0.25},
      {__LINE__, 10.7709, 13, 0.37},
      {__LINE__, 26.2514, 17, 0.93},
      {__LINE__, 36.4799, 29, 0.84},
      {__LINE__, 25.818, 31, 0.27},
      {__LINE__, 63.3346, 64, 0.50},
      {__LINE__, 196.211, 128, 0.9999},
      {__LINE__, 215.21, 243, 0.10},
      {__LINE__, 285.393, 256, 0.90},
      {__LINE__, 984.504, 1024, 0.1923},
      {__LINE__, 2043.85, 2048, 0.4783},
      {__LINE__, 48004.6, 48273, 0.194},
  };
  for (const auto& spec : specs) {
    SCOPED_TRACE(spec.line);
    // Verify all values are have at most a 1% relative error.
    const double val = ChiSquareValue(spec.df, spec.confidence);
    const double err = std::max(5e-6, spec.chi_square / 5e3);  // 1 part in 5000
    EXPECT_NEAR(spec.chi_square, val, err) << spec.line;
  }

  // Relaxed test for extreme values, from
  //  http://www.ciphersbyritter.com/JAVASCRP/NORMCHIK.HTM#ChiSquare
  EXPECT_NEAR(49.2680, ChiSquareValue(100, 1e-6), 5);  // 0.000'005 mark
  EXPECT_NEAR(123.499, ChiSquareValue(200, 1e-6), 5);  // 0.000'005 mark

  EXPECT_NEAR(149.449, ChiSquareValue(100, 0.999), 0.01);
  EXPECT_NEAR(161.318, ChiSquareValue(100, 0.9999), 0.01);
  EXPECT_NEAR(172.098, ChiSquareValue(100, 0.99999), 0.01);

  EXPECT_NEAR(381.426, ChiSquareValue(300, 0.999), 0.05);
  EXPECT_NEAR(399.756, ChiSquareValue(300, 0.9999), 0.1);
  EXPECT_NEAR(416.126, ChiSquareValue(300, 0.99999), 0.2);
}

TEST(ChiSquareTest, PValue) {
  struct {
    int line;
    double pval;
    double chi_square;
    int df;
  } static const specs[] = {
      {__LINE__, 1, 0, 0},
      {__LINE__, 0, 0.001, 0},
      {__LINE__, 1.000, 0, 453},
      {__LINE__, 0.134471, 7972.52, 7834},
      {__LINE__, 0.203922, 28.32, 23},
      {__LINE__, 0.737171, 48274, 48472},
      {__LINE__, 0.444146, 583.1234, 579},
      {__LINE__, 0.294814, 138.2, 130},
      {__LINE__, 0.0816532, 12.63, 7},
      {__LINE__, 0, 682.32, 67},
      {__LINE__, 0.49405, 999, 999},
      {__LINE__, 1.000, 0, 9999},
      {__LINE__, 0.997477, 0.00001, 1},
      {__LINE__, 0, 5823.21, 5040},
  };
  for (const auto& spec : specs) {
    SCOPED_TRACE(spec.line);
    const double pval = ChiSquarePValue(spec.chi_square, spec.df);
    EXPECT_NEAR(spec.pval, pval, 1e-3);
  }
}

TEST(ChiSquareTest, CalcChiSquare) {
  struct {
    int line;
    std::vector<int> expected;
    std::vector<int> actual;
  } const specs[] = {
      {__LINE__,
       {56, 234, 76, 1, 546, 1, 87, 345, 1, 234},
       {2, 132, 4, 43, 234, 8, 345, 8, 236, 56}},
      {__LINE__,
       {123, 36, 234, 367, 345, 2, 456, 567, 234, 567},
       {123, 56, 2345, 8, 345, 8, 2345, 23, 48, 267}},
      {__LINE__,
       {123, 234, 345, 456, 567, 678, 789, 890, 98, 76},
       {123, 234, 345, 456, 567, 678, 789, 890, 98, 76}},
      {__LINE__, {3, 675, 23, 86, 2, 8, 2}, {456, 675, 23, 86, 23, 65, 2}},
      {__LINE__, {1}, {23}},
  };
  for (const auto& spec : specs) {
    SCOPED_TRACE(spec.line);
    double chi_square = 0;
    for (size_t i = 0; i < spec.expected.size(); ++i) {
      const double diff = spec.actual[i] - spec.expected[i];
      chi_square += (diff * diff) / spec.expected[i];
    }
    EXPECT_NEAR(chi_square,
                ChiSquare(std::begin(spec.actual), std::end(spec.actual),
                          std::begin(spec.expected), std::end(spec.expected)),
                1e-5);
  }
}

TEST(ChiSquareTest, CalcChiSquareInt64) {
  const int64_t data[3] = {910293487, 910292491, 910216780};
  // $ python -c "import scipy.stats
  // > print scipy.stats.chisquare([910293487, 910292491, 910216780])[0]"
  // 4.25410123524
  double sum = absl::c_accumulate(data, double{0});
  size_t n = absl::c_distance(data);
  double a = ChiSquareWithExpected(std::begin(data), std::end(data), sum / n);
  EXPECT_NEAR(4.254101, a, 1e-6);

  // ... Or with known values.
  double b =
      ChiSquareWithExpected(std::begin(data), std::end(data), 910267586.0);
  EXPECT_NEAR(4.254101, b, 1e-6);
}

TEST(ChiSquareTest, TableData) {
  // Test data from
  // http://www.itl.nist.gov/div898/handbook/eda/section3/eda3674.htm
  //    0.90      0.95     0.975      0.99     0.999
  const double data[100][5] = {
      /* 1*/ {2.706, 3.841, 5.024, 6.635, 10.828},
      /* 2*/ {4.605, 5.991, 7.378, 9.210, 13.816},
      /* 3*/ {6.251, 7.815, 9.348, 11.345, 16.266},
      /* 4*/ {7.779, 9.488, 11.143, 13.277, 18.467},
      /* 5*/ {9.236, 11.070, 12.833, 15.086, 20.515},
      /* 6*/ {10.645, 12.592, 14.449, 16.812, 22.458},
      /* 7*/ {12.017, 14.067, 16.013, 18.475, 24.322},
      /* 8*/ {13.362, 15.507, 17.535, 20.090, 26.125},
      /* 9*/ {14.684, 16.919, 19.023, 21.666, 27.877},
      /*10*/ {15.987, 18.307, 20.483, 23.209, 29.588},
      /*11*/ {17.275, 19.675, 21.920, 24.725, 31.264},
      /*12*/ {18.549, 21.026, 23.337, 26.217, 32.910},
      /*13*/ {19.812, 22.362, 24.736, 27.688, 34.528},
      /*14*/ {21.064, 23.685, 26.119, 29.141, 36.123},
      /*15*/ {22.307, 24.996, 27.488, 30.578, 37.697},
      /*16*/ {23.542, 26.296, 28.845, 32.000, 39.252},
      /*17*/ {24.769, 27.587, 30.191, 33.409, 40.790},
      /*18*/ {25.989, 28.869, 31.526, 34.805, 42.312},
      /*19*/ {27.204, 30.144, 32.852, 36.191, 43.820},
      /*20*/ {28.412, 31.410, 34.170, 37.566, 45.315},
      /*21*/ {29.615, 32.671, 35.479, 38.932, 46.797},
      /*22*/ {30.813, 33.924, 36.781, 40.289, 48.268},
      /*23*/ {32.007, 35.172, 38.076, 41.638, 49.728},
      /*24*/ {33.196, 36.415, 39.364, 42.980, 51.179},
      /*25*/ {34.382, 37.652, 40.646, 44.314, 52.620},
      /*26*/ {35.563, 38.885, 41.923, 45.642, 54.052},
      /*27*/ {36.741, 40.113, 43.195, 46.963, 55.476},
      /*28*/ {37.916, 41.337, 44.461, 48.278, 56.892},
      /*29*/ {39.087, 42.557, 45.722, 49.588, 58.301},
      /*30*/ {40.256, 43.773, 46.979, 50.892, 59.703},
      /*31*/ {41.422, 44.985, 48.232, 52.191, 61.098},
      /*32*/ {42.585, 46.194, 49.480, 53.486, 62.487},
      /*33*/ {43.745, 47.400, 50.725, 54.776, 63.870},
      /*34*/ {44.903, 48.602, 51.966, 56.061, 65.247},
      /*35*/ {46.059, 49.802, 53.203, 57.342, 66.619},
      /*36*/ {47.212, 50.998, 54.437, 58.619, 67.985},
      /*37*/ {48.363, 52.192, 55.668, 59.893, 69.347},
      /*38*/ {49.513, 53.384, 56.896, 61.162, 70.703},
      /*39*/ {50.660, 54.572, 58.120, 62.428, 72.055},
      /*40*/ {51.805, 55.758, 59.342, 63.691, 73.402},
      /*41*/ {52.949, 56.942, 60.561, 64.950, 74.745},
      /*42*/ {54.090, 58.124, 61.777, 66.206, 76.084},
      /*43*/ {55.230, 59.304, 62.990, 67.459, 77.419},
      /*44*/ {56.369, 60.481, 64.201, 68.710, 78.750},
      /*45*/ {57.505, 61.656, 65.410, 69.957, 80.077},
      /*46*/ {58.641, 62.830, 66.617, 71.201, 81.400},
      /*47*/ {59.774, 64.001, 67.821, 72.443, 82.720},
      /*48*/ {60.907, 65.171, 69.023, 73.683, 84.037},
      /*49*/ {62.038, 66.339, 70.222, 74.919, 85.351},
      /*50*/ {63.167, 67.505, 71.420, 76.154, 86.661},
      /*51*/ {64.295, 68.669, 72.616, 77.386, 87.968},
      /*52*/ {65.422, 69.832, 73.810, 78.616, 89.272},
      /*53*/ {66.548, 70.993, 75.002, 79.843, 90.573},
      /*54*/ {67.673, 72.153, 76.192, 81.069, 91.872},
      /*55*/ {68.796, 73.311, 77.380, 82.292, 93.168},
      /*56*/ {69.919, 74.468, 78.567, 83.513, 94.461},
      /*57*/ {71.040, 75.624, 79.752, 84.733, 95.751},
      /*58*/ {72.160, 76.778, 80.936, 85.950, 97.039},
      /*59*/ {73.279, 77.931, 82.117, 87.166, 98.324},
      /*60*/ {74.397, 79.082, 83.298, 88.379, 99.607},
      /*61*/ {75.514, 80.232, 84.476, 89.591, 100.888},
      /*62*/ {76.630, 81.381, 85.654, 90.802, 102.166},
      /*63*/ {77.745, 82.529, 86.830, 92.010, 103.442},
      /*64*/ {78.860, 83.675, 88.004, 93.217, 104.716},
      /*65*/ {79.973, 84.821, 89.177, 94.422, 105.988},
      /*66*/ {81.085, 85.965, 90.349, 95.626, 107.258},
      /*67*/ {82.197, 87.108, 91.519, 96.828, 108.526},
      /*68*/ {83.308, 88.250, 92.689, 98.028, 109.791},
      /*69*/ {84.418, 89.391, 93.856, 99.228, 111.055},
      /*70*/ {85.527, 90.531, 95.023, 100.425, 112.317},
      /*71*/ {86.635, 91.670, 96.189, 101.621, 113.577},
      /*72*/ {87.743, 92.808, 97.353, 102.816, 114.835},
      /*73*/ {88.850, 93.945, 98.516, 104.010, 116.092},
      /*74*/ {89.956, 95.081, 99.678, 105.202, 117.346},
      /*75*/ {91.061, 96.217, 100.839, 106.393, 118.599},
      /*76*/ {92.166, 97.351, 101.999, 107.583, 119.850},
      /*77*/ {93.270, 98.484, 103.158, 108.771, 121.100},
      /*78*/ {94.374, 99.617, 104.316, 109.958, 122.348},
      /*79*/ {95.476, 100.749, 105.473, 111.144, 123.594},
      /*80*/ {96.578, 101.879, 106.629, 112.329, 124.839},
      /*81*/ {97.680, 103.010, 107.783, 113.512, 126.083},
      /*82*/ {98.780, 104.139, 108.937, 114.695, 127.324},
      /*83*/ {99.880, 105.267, 110.090, 115.876, 128.565},
      /*84*/ {100.980, 106.395, 111.242, 117.057, 129.804},
      /*85*/ {102.079, 107.522, 112.393, 118.236, 131.041},
      /*86*/ {103.177, 108.648, 113.544, 119.414, 132.277},
      /*87*/ {104.275, 109.773, 114.693, 120.591, 133.512},
      /*88*/ {105.372, 110.898, 115.841, 121.767, 134.746},
      /*89*/ {106.469, 112.022, 116.989, 122.942, 135.978},
      /*90*/ {107.565, 113.145, 118.136, 124.116, 137.208},
      /*91*/ {108.661, 114.268, 119.282, 125.289, 138.438},
      /*92*/ {109.756, 115.390, 120.427, 126.462, 139.666},
      /*93*/ {110.850, 116.511, 121.571, 127.633, 140.893},
      /*94*/ {111.944, 117.632, 122.715, 128.803, 142.119},
      /*95*/ {113.038, 118.752, 123.858, 129.973, 143.344},
      /*96*/ {114.131, 119.871, 125.000, 131.141, 144.567},
      /*97*/ {115.223, 120.990, 126.141, 132.309, 145.789},
      /*98*/ {116.315, 122.108, 127.282, 133.476, 147.010},
      /*99*/ {117.407, 123.225, 128.422, 134.642, 148.230},
      /*100*/ {118.498, 124.342, 129.561, 135.807, 149.449} /**/};

  //    0.90      0.95     0.975      0.99     0.999
  for (size_t i = 0; i < std::size(data); i++) {
    const double E = 0.0001;
    EXPECT_NEAR(ChiSquarePValue(data[i][0], i + 1), 0.10, E)
        << i << " " << data[i][0];
    EXPECT_NEAR(ChiSquarePValue(data[i][1], i + 1), 0.05, E)
        << i << " " << data[i][1];
    EXPECT_NEAR(ChiSquarePValue(data[i][2], i + 1), 0.025, E)
        << i << " " << data[i][2];
    EXPECT_NEAR(ChiSquarePValue(data[i][3], i + 1), 0.01, E)
        << i << " " << data[i][3];
    EXPECT_NEAR(ChiSquarePValue(data[i][4], i + 1), 0.001, E)
        << i << " " << data[i][4];

    const double F = 0.1;
    EXPECT_NEAR(ChiSquareValue(i + 1, 0.90), data[i][0], F) << i;
    EXPECT_NEAR(ChiSquareValue(i + 1, 0.95), data[i][1], F) << i;
    EXPECT_NEAR(ChiSquareValue(i + 1, 0.975), data[i][2], F) << i;
    EXPECT_NEAR(ChiSquareValue(i + 1, 0.99), data[i][3], F) << i;
    EXPECT_NEAR(ChiSquareValue(i + 1, 0.999), data[i][4], F) << i;
  }
}

TEST(ChiSquareTest, ChiSquareTwoIterator) {
  // Test data from http://www.stat.yale.edu/Courses/1997-98/101/chigf.htm
  // Null-hypothesis: This data is normally distributed.
  const int counts[10] = {6, 6, 18, 33, 38, 38, 28, 21, 9, 3};
  const double expected[10] = {4.6,  8.8,  18.4, 30.0, 38.2,
                               38.2, 30.0, 18.4, 8.8,  4.6};
  double chi_square = ChiSquare(std::begin(counts), std::end(counts),
                                std::begin(expected), std::end(expected));
  EXPECT_NEAR(chi_square, 2.69, 0.001);

  // Degrees of freedom: 10 bins. two estimated parameters. = 10 - 2 - 1.
  const int dof = 7;
  // The critical value of 7, 95% => 14.067 (see above test)
  double p_value_05 = ChiSquarePValue(14.067, dof);
  EXPECT_NEAR(p_value_05, 0.05, 0.001);  // 95%-ile p-value

  double p_actual = ChiSquarePValue(chi_square, dof);
  EXPECT_GT(p_actual, 0.05);  // Accept the null hypothesis.
}

TEST(ChiSquareTest, DiceRolls) {
  // Assume we are testing 102 fair dice rolls.
  // Null-hypothesis: This data is fairly distributed.
  //
  // The dof value of 4, @95% = 9.488 (see above test)
  // The dof value of 5, @95% = 11.070
  const int rolls[6] = {22, 11, 17, 14, 20, 18};
  double sum = absl::c_accumulate(rolls, double{0});
  size_t n = absl::c_distance(rolls);

  double a = ChiSquareWithExpected(std::begin(rolls), std::end(rolls), sum / n);
  EXPECT_NEAR(a, 4.70588, 1e-5);
  EXPECT_LT(a, ChiSquareValue(4, 0.95));

  double p_a = ChiSquarePValue(a, 4);
  EXPECT_NEAR(p_a, 0.318828, 1e-5);  // Accept the null hypothesis.

  double b = ChiSquareWithExpected(std::begin(rolls), std::end(rolls), 17.0);
  EXPECT_NEAR(b, 4.70588, 1e-5);
  EXPECT_LT(b, ChiSquareValue(5, 0.95));

  double p_b = ChiSquarePValue(b, 5);
  EXPECT_NEAR(p_b, 0.4528180, 1e-5);  // Accept the null hypothesis.
}

}  // namespace
