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

#include <benchmark/benchmark.h>
#include <Eigen/Eigenvalues>
#include <cstdlib>

using namespace Eigen;

template <typename Scalar, int StorageOrder>
static void BM_EigenSolverStride(benchmark::State& state) {
  using Mat = Matrix<Scalar, Dynamic, Dynamic, StorageOrder>;
  const Index n = state.range(0);
  const bool computeVectors = state.range(1) != 0;
  std::srand(1);
  const Mat a = Mat::Random(n, n);
  EigenSolver<Mat> solver(a, true);
  if (solver.info() != Success) {
    state.SkipWithError("EigenSolver did not converge");
    return;
  }
  const Mat vectors = solver.pseudoEigenvectors();
  const Mat values = solver.pseudoEigenvalueMatrix();
  const Scalar residual = (a * vectors - vectors * values).norm();
  const Scalar bound = Scalar(64 * n) * NumTraits<Scalar>::epsilon() * a.norm() * vectors.norm();
  if (!(residual <= bound)) {
    state.SkipWithError("Eigenpair residual failed");
    return;
  }
  for (auto _ : state) {
    solver.compute(a, computeVectors);
    benchmark::DoNotOptimize(solver.eigenvalues().data());
    benchmark::ClobberMemory();
  }
}

BENCHMARK_TEMPLATE(BM_EigenSolverStride, float, ColMajor)
    ->ArgsProduct({{32, 128, 500, 512, 768, 1000, 1001, 1024}, {0, 1}});
BENCHMARK_TEMPLATE(BM_EigenSolverStride, double, ColMajor)
    ->ArgsProduct({{32, 128, 500, 512, 768, 1000, 1001, 1024}, {0, 1}});
BENCHMARK_TEMPLATE(BM_EigenSolverStride, float, RowMajor)
    ->ArgsProduct({{32, 128, 500, 512, 768, 1000, 1001, 1024}, {0, 1}});
BENCHMARK_TEMPLATE(BM_EigenSolverStride, double, RowMajor)
    ->ArgsProduct({{32, 128, 500, 512, 768, 1000, 1001, 1024}, {0, 1}});
