// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// 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/.

#ifndef EIGEN_GPU_MODULE_H
#define EIGEN_GPU_MODULE_H

#include "Core"

#include "src/Core/util/DisableStupidWarnings.h"

/** \defgroup GPU_Module GPU module
 *
 * GPU-accelerated solvers and operations using NVIDIA CUDA libraries
 * (cuSOLVER, cuBLAS, cuSPARSE, cuFFT, cuDSS).
 *
 * This module provides explicit GPU solver classes that coexist with Eigen's
 * CPU solvers. Unlike the LAPACKE dispatch (which replaces the CPU
 * implementation globally), GPU classes are separate types the user
 * instantiates by choice:
 *
 * \code
 * #define EIGEN_USE_GPU
 * #include <Eigen/GPU>
 *
 * // CPU path (unchanged)
 * Eigen::LLT<Eigen::MatrixXd> llt_cpu(A);
 *
 * // GPU path (explicit)
 * Eigen::GpuLLT<double> llt_gpu(A);   // L stays on device
 * auto X = llt_gpu.solve(B);          // only B transferred per solve
 * \endcode
 *
 * Requires CUDA 11.4+. See CLAUDE.md.
 */

#ifdef EIGEN_USE_GPU
// IWYU pragma: begin_exports
#include "src/GPU/DeviceMatrix.h"
#include "src/GPU/GpuContext.h"
#include "src/GPU/DeviceExpr.h"
#include "src/GPU/DeviceBlasExpr.h"
#include "src/GPU/DeviceSolverExpr.h"
#include "src/GPU/DeviceDispatch.h"
#include "src/GPU/GpuLLT.h"
#include "src/GPU/GpuLU.h"
#include "src/GPU/GpuQR.h"
#include "src/GPU/GpuSVD.h"
#include "src/GPU/GpuEigenSolver.h"
// IWYU pragma: end_exports
#endif

#include "src/Core/util/ReenableStupidWarnings.h"

#endif  // EIGEN_GPU_MODULE_H
