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

#include <unsupported/Eigen/Polynomials>
#include <vector>
#include <iostream>

using namespace Eigen;
using namespace std;

int main() {
  typedef Matrix<double, 5, 1> Vector5d;

  Vector5d roots = Vector5d::Random();
  cout << "Roots: " << roots.transpose() << endl;
  Eigen::Matrix<double, 6, 1> polynomial;
  roots_to_monicPolynomial(roots, polynomial);

  PolynomialSolver<double, 5> psolve(polynomial);
  cout << "Complex roots: " << psolve.roots().transpose() << endl;

  std::vector<double> realRoots;
  psolve.realRoots(realRoots);
  Map<Vector5d> mapRR(&realRoots[0]);
  cout << "Real roots: " << mapRR.transpose() << endl;

  cout << endl;
  cout << "Illustration of the convergence problem with the QR algorithm: " << endl;
  cout << "---------------------------------------------------------------" << endl;
  Eigen::Matrix<float, 7, 1> hardCase_polynomial;
  hardCase_polynomial << -0.957, 0.9219, 0.3516, 0.9453, -0.4023, -0.5508, -0.03125;
  cout << "Hard case polynomial defined by floats: " << hardCase_polynomial.transpose() << endl;
  PolynomialSolver<float, 6> psolvef(hardCase_polynomial);
  cout << "Complex roots: " << psolvef.roots().transpose() << endl;
  Eigen::Matrix<float, 6, 1> evals;
  for (int i = 0; i < 6; ++i) {
    evals[i] = std::abs(poly_eval(hardCase_polynomial, psolvef.roots()[i]));
  }
  cout << "Norms of the evaluations of the polynomial at the roots: " << evals.transpose() << endl << endl;

  cout << "Using double's almost always solves the problem for small degrees: " << endl;
  cout << "-------------------------------------------------------------------" << endl;
  PolynomialSolver<double, 6> psolve6d(hardCase_polynomial.cast<double>());
  cout << "Complex roots: " << psolve6d.roots().transpose() << endl;
  for (int i = 0; i < 6; ++i) {
    std::complex<float> castedRoot(psolve6d.roots()[i].real(), psolve6d.roots()[i].imag());
    evals[i] = std::abs(poly_eval(hardCase_polynomial, castedRoot));
  }
  cout << "Norms of the evaluations of the polynomial at the roots: " << evals.transpose() << endl << endl;

  cout.precision(10);
  cout << "The last root in float then in double: " << psolvef.roots()[5] << "\t" << psolve6d.roots()[5] << endl;
  std::complex<float> castedRoot(psolve6d.roots()[5].real(), psolve6d.roots()[5].imag());
  cout << "Norm of the difference: " << std::abs(psolvef.roots()[5] - castedRoot) << endl;
}
