// SPDX-FileCopyrightText: The Eigen Authors
// SPDX-License-Identifier: MPL-2.0

#ifdef EIGEN_DEFAULT_DENSE_INDEX_TYPE
#undef EIGEN_DEFAULT_DENSE_INDEX_TYPE
#endif
#define EIGEN_DEFAULT_DENSE_INDEX_TYPE int
#include "main.h"

#include <unsupported/Eigen/StructuredMatrices>

using namespace Eigen;

// Roughly 2.2 million factors near the top of the double range exceed a
// 32-bit Index exponent even though the determinant has the unambiguous result
// +Inf. The internal exponent type must not wrap.
void test_vandermonde_determinant_int_index() {
  typedef Matrix<double, Dynamic, 1> Vec;
  const Index n = 2100;
  const double low = -9e307, high = 9e307;
  Vec x(n);
  for (Index i = 0; i < n; ++i) {
    const double t = double(i) / double(n - 1);
    x[i] = (1.0 - t) * low + t * high;
  }

  const double det = Vandermonde<double>(x).determinant();
  VERIFY((numext::isinf)(det));
  VERIFY(det > 0.0);
}

// The scaled-Horner frame can likewise exceed a 32-bit Index exponent. A
// degree-2,099,999 monomial at DBL_MAX must overflow to +Inf rather than wrap
// its accumulated exponent and underflow to zero.
void test_vandermonde_scaled_horner_int_index() {
  typedef Matrix<double, Dynamic, 1> Vec;
  const Index n = 2100000;
  Vec x(1), a = Vec::Zero(n);
  x[0] = (std::numeric_limits<double>::max)();
  a[n - 1] = 1.0;

  Vec y = Vandermonde<double>(x, n) * a;
  VERIFY((numext::isinf)(y[0]));
  VERIFY(y[0] > 0.0);
}

EIGEN_DECLARE_TEST(structured_vandermonde_int_index) {
  STATIC_CHECK(sizeof(Index) == sizeof(int));
  CALL_SUBTEST_1(test_vandermonde_determinant_int_index());
  CALL_SUBTEST_2(test_vandermonde_scaled_horner_int_index());
}
