// 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_ACCELERATESUPPORT_MODULE_H
#define EIGEN_ACCELERATESUPPORT_MODULE_H

#include "SparseCore"

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

/** \ingroup Support_modules
  * \defgroup AccelerateSupport_Module AccelerateSupport module
  *
  * This module provides an interface to the Apple Accelerate library.
  * It provides the seven following main factorization classes:
  * - class AccelerateLLT: a Cholesky (LL^T) factorization.
  * - class AccelerateLDLT: the default LDL^T factorization.
  * - class AccelerateLDLTUnpivoted: a Cholesky-like LDL^T factorization with only 1x1 pivots and no pivoting
  * - class AccelerateLDLTSBK: an LDL^T factorization with Supernode Bunch-Kaufman and static pivoting
  * - class AccelerateLDLTTPP: an LDL^T factorization with full threshold partial pivoting
  * - class AccelerateQR: a QR factorization
  * - class AccelerateCholeskyAtA: a QR factorization without storing Q (equivalent to A^TA = R^T R)
  *
  * \code
  * #include <Eigen/AccelerateSupport>
  * \endcode
  *
  * In order to use this module, the Accelerate headers must be accessible from
  * the include paths, and your binary must be linked to the Accelerate framework.
  * The Accelerate library is only available on Apple hardware.
  * 
  * Note that many of the algorithms can be influenced by the UpLo template
  * argument. All matrices are assumed to be symmetric. For example, the following
  * creates an LDLT factorization where your matrix is symmetric (implicit) and
  * uses the lower triangle:
  * 
  * \code
  * AccelerateLDLT<SparseMatrix<float>, Lower> ldlt;
  * \endcode
  */

#include "src/AccelerateSupport/AccelerateSupport.h"

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

#endif // EIGEN_ACCELERATESUPPORT_MODULE_H
