// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2010 Manuel Yguel <manuel.yguel@gmail.com>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
// SPDX-License-Identifier: MPL-2.0

#include "main.h"
#include <unsupported/Eigen/Polynomials>
#include <iostream>

using namespace std;

namespace Eigen {
namespace internal {
template <int Size>
struct increment_if_fixed_size : std::integral_constant<int, (Size == Dynamic) ? Dynamic : Size + 1> {};
}  // namespace internal
}  // namespace Eigen

template <typename Scalar_, int Deg_>
void realRoots_to_monicPolynomial_test(int deg) {
  typedef internal::increment_if_fixed_size<Deg_> Dim;
  typedef Matrix<Scalar_, Dim::value, 1> PolynomialType;
  typedef Matrix<Scalar_, Deg_, 1> EvalRootsType;

  PolynomialType pols(deg + 1);
  EvalRootsType roots = EvalRootsType::Random(deg);
  roots_to_monicPolynomial(roots, pols);

  EvalRootsType evr(deg);
  for (int i = 0; i < roots.size(); ++i) {
    evr[i] = std::abs(poly_eval(pols, roots[i]));
  }

  bool evalToZero = evr.isZero(test_precision<Scalar_>());
  if (!evalToZero) {
    cerr << evr.transpose() << endl;
  }
  VERIFY(evalToZero);
}

template <typename Scalar_>
void realRoots_to_monicPolynomial_scalar() {
  CALL_SUBTEST_2((realRoots_to_monicPolynomial_test<Scalar_, 2>(2)));
  CALL_SUBTEST_3((realRoots_to_monicPolynomial_test<Scalar_, 3>(3)));
  CALL_SUBTEST_4((realRoots_to_monicPolynomial_test<Scalar_, 4>(4)));
  CALL_SUBTEST_5((realRoots_to_monicPolynomial_test<Scalar_, 5>(5)));
  CALL_SUBTEST_6((realRoots_to_monicPolynomial_test<Scalar_, 6>(6)));
  CALL_SUBTEST_7((realRoots_to_monicPolynomial_test<Scalar_, 7>(7)));
  CALL_SUBTEST_8((realRoots_to_monicPolynomial_test<Scalar_, 17>(17)));

  CALL_SUBTEST_9((realRoots_to_monicPolynomial_test<Scalar_, Dynamic>(internal::random<int>(18, 26))));
}

template <typename Scalar_, int Deg_>
void CauchyBounds(int deg) {
  typedef internal::increment_if_fixed_size<Deg_> Dim;
  typedef Matrix<Scalar_, Dim::value, 1> PolynomialType;
  typedef Matrix<Scalar_, Deg_, 1> EvalRootsType;

  PolynomialType pols(deg + 1);
  EvalRootsType roots = EvalRootsType::Random(deg);
  roots_to_monicPolynomial(roots, pols);
  Scalar_ M = cauchy_max_bound(pols);
  Scalar_ m = cauchy_min_bound(pols);
  Scalar_ Max = roots.array().abs().maxCoeff();
  Scalar_ min = roots.array().abs().minCoeff();
  bool eval = (M >= Max) && (m <= min);
  if (!eval) {
    cerr << "Roots: " << roots << endl;
    cerr << "Bounds: (" << m << ", " << M << ")" << endl;
    cerr << "Min,Max: (" << min << ", " << Max << ")" << endl;
  }
  VERIFY(eval);
}

template <typename Scalar_>
void CauchyBounds_scalar() {
  CALL_SUBTEST_2((CauchyBounds<Scalar_, 2>(2)));
  CALL_SUBTEST_3((CauchyBounds<Scalar_, 3>(3)));
  CALL_SUBTEST_4((CauchyBounds<Scalar_, 4>(4)));
  CALL_SUBTEST_5((CauchyBounds<Scalar_, 5>(5)));
  CALL_SUBTEST_6((CauchyBounds<Scalar_, 6>(6)));
  CALL_SUBTEST_7((CauchyBounds<Scalar_, 7>(7)));
  CALL_SUBTEST_8((CauchyBounds<Scalar_, 17>(17)));

  CALL_SUBTEST_9((CauchyBounds<Scalar_, Dynamic>(internal::random<int>(18, 26))));
}

EIGEN_DECLARE_TEST(polynomialutils) {
  for (int i = 0; i < g_repeat; i++) {
    realRoots_to_monicPolynomial_scalar<double>();
    realRoots_to_monicPolynomial_scalar<float>();
    CauchyBounds_scalar<double>();
    CauchyBounds_scalar<float>();
  }
}
